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),
],
)