Ga naar inhoud

Authenticatie

Starlette biedt een eenvoudige maar krachtige interface voor het afhandelen van authenticatie en machtigingen. Zodra u AuthenticationMiddleware hebt geïnstalleerd met de juiste authenticatie-backend, zijn de request.user- en request.auth-interfaces beschikbaar in uw eindpunten.

Starlette.applicaties importeren vanuit Starlette
Van starlette.authenticatie import (
    AuthCredentials, AuthenticationBackend, AuthenticationError, SimpleUser
)
Middleware importeren vanuit starlette.middleware
Vanaf starlette.middleware.authentication importeren AuthenticationMiddleware
Vanaf starlette.reacties importeren PlainTextResponse
Van starlette. routing importeren Route
Base64 importeren
Binascii importeren


Klasse BasicAuthBackend (AuthenticationBackend):
    Async-verificatie (zelf, conn):
        Als "Autorisatie" niet in conn.headers staat:
            Terugkeer

        Auth = conn.headers ["Machtiging"]
        Probeer:
            Regeling, referenties = auth.split ()
            Als scheme.lower ()! = 'basis':
                Terugkeer
            Gedecodeerd = base64.b64decode (referenties) .decode ("ascii")
        Behalve (ValueError, UnicodeDecodeError, binascii. Error) als exc:
            AuthenticationError verhogen ('Ongeldige basisverificatiegegevens')

        Gebruikersnaam, _, wachtwoord = decoded.partition (":")
        # TODO: U wilt hier de gebruikersnaam en het wachtwoord verifiëren.
        Retourneer AuthCredentials (["geverifieerd"]), SimpleUser (gebruikersnaam)


Async def homepage (aanvraag):
    Als request .user.user _ geverifieerd is:
        Retourneer PlainTextResponse ('Hallo', + aanvraag.user. _ naam weergeven)
    Retourneer PlainTextResponse ('Hallo, jij')

Routes = [
    Route ("/", eindpunt = startpagina)
]

Tussenwerk = [
    Middleware (AuthenticationMiddleware, backend=BasicAuthBackend ())
]

App = Starlette (routes = routes, middleware=middleware)

gebruiker

Zodra de AuthenticationMiddleware-installatie is voltooid, is de request.user-interface beschikbaar voor gebruik met eindpunten of andere middleware.

Deze interface moet een subklasse van BaseUser overnemen die twee eigenschappen biedt, evenals alle andere informatie in uw gebruikersmodel.

  • .is_authenticated
  • .display_name

Starlette biedt twee ingebouwde gebruikersimplementaties:UnauthenticatedUser() en SimpleUser(username).

verificatiegegevens

Belangrijk is dat authenticatiereferenties als een apart concept van gebruikers moeten worden behandeld. Authenticatieschema 's moeten specifieke machtigingen kunnen beperken of verlenen, onafhankelijk van de gebruikersidentiteit.

De AuthCredentials-klasse biedt de basisinterface die wordt weergegeven door request.auth:

  • .scopes

toestemming

Machtigingen worden geïmplementeerd als eindpuntdecorateurs om inkomende verzoeken te dwingen het vereiste authenticatiebereik op te nemen.

Van starlette.authentication import vereist


@ vereist ('geverifieerd')
Async def dashboard (aanvraag):
    ...

U kunt een of meer van de vereiste bereiken opnemen:

Van starlette.authentication import vereist


@ vereist (['geverifieerd', 'admin'])
Async def dashboard (aanvraag):
    ...

Standaard wordt een 403-reactie geretourneerd wanneer geen toestemming is verleend. In sommige gevallen wilt u dit misschien aanpassen, zoals het verbergen van informatie over de URL-lay-out voor niet-geverifieerde gebruikers.

Van starlette.authentication import vereist


@ vereist (['geverifieerd', 'admin'], status _ code = 404)
Async def dashboard (aanvraag):
    ...

!!! Merk op dat WebSockets de status_code parameter niet ondersteunen. Voor deze gevallen zal altijd een 403 (verboden) statuscode worden gebruikt.

Of misschien wilt u niet-geverifieerde gebruikers omleiden naar een andere pagina.

Van starlette.authentication import vereist


Async def homepage (aanvraag):
    ...


@ vereist ('geverifieerd', redirect = 'homepage')
Async def dashboard (aanvraag):
    ...

Bij het omleiden van gebruikers bevat de pagina waarnaar u ze omleidt de URL die ze oorspronkelijk hadden aangevraagd in de next-queryparameters:

Van starlette.authentication import vereist
RedirectResponse geïmporteerd uit starlette.reacties


@ vereist ('geverifieerd', redirect = 'login')
Async def admin (verzoek):
    ...


Async def login (aanvraag):
    Indien aanvraag. methode = = "POST":
        # Nu de gebruiker is geverifieerd,
        # we kunnen ze naar hun oorspronkelijke aanvraagbestemming sturen
        Als request .user.user _ geverifieerd is:
            next _ url = aanvraag.query _ params krijgen ("volgende")
            Als volgende _ url:
                RetourneerRedirectResponse (volgende _ url)
            RetouromleidingReactie ("/")

Voor op klassen gebaseerde eindpunten moet u decorateurs rond de methoden van de klas wikkelen.

Van starlette.authentication import vereist
Vanuit starlette.endpoints HTTPEndpoint importeren


Klasse Dashboard (HTTPEndpoint):
    @ vereist ("geverifieerd")
    Aync def get (zelf, verzoek):
        ...

Aangepaste verificatie fout antwoord

U kunt de foutreactie aanpassen die wordt verzonden wanneer de authenticatiebackend AuthenticationError gooit:

Starlette.applicaties importeren vanuit Starlette
Middleware importeren vanuit starlette.middleware
Vanaf starlette.middleware.authentication importeren AuthenticationMiddleware
Van starlette. aanvragen import aanvragen
Uit starlette.reacties importeren JSONResponse


Def on _ auth _ error (verzoek: verzoek, exc: uitzondering):
    Geef JSONResponse terug ({"error": str(exc)}, status _ code = 401)

Uitgever: App = Starlette (
    Tussenwerk = [
        Middleware (AuthenticationMiddleware, backend=BasicAuthBackend (), on _ error = on _ auth _ error),
    ],
)