Zum Inhalt

Authentifizierung

Starlette bietet eine einfache, aber leistungsstarke Schnittstelle für die Verarbeitung von Authentifizierung und Berechtigungen, sobald Sie mit dem entsprechenden Authentifizierungs-Back-End installiert haben. AuthenticationMiddleware , request.user und request.auth Die Schnittstelle wird in Ihrem Terminal verfügbar sein.

von starlette. applications import Starlette
Abbildung 1: Abbildung 1. Abbildung (
    AuthCredentials, AuthenticationBackend, AuthenticationError und SimpleUser
)
von starlette. midleware import Middleware
von starlette. middleware. authentication import AuthenticationMiddleware
from starlette. responses import plainTextResponse (englisch)
von starlette. routing import Route
Der Import von Base64
Import von Binascii


class BasicAuthBackend (AuthenticationBackend):
    async def authenticate (self, conn): def authenticate (self, conn) authentifiziert
        if "Authorization" nicht in conn. headers:
            return Zurück

        auth = conn. headers ["Autorisierung"]
        versuchen:
            scheme, credentials = auth. split (){adv}[Bearbeiten | Quelltext bearbeiten]
            if scheme. lower ()!='basic':
                return Zurück
            decoded = base64.b64decode (credentials). decode ("ascii")[Bearbeiten | Quelltext bearbeiten]
        except (ValueError, UnicodeDecodeError, binascii. Error) als exc:
            raise AuthenticationError ('Invalid basic auth credentials')(Ungültiger Grund

        username,_, password = decoded. partition (":") Benutzername,_, Passwort = decoded. partition (":")
        #TODO: Sie möchten den Benutzernamen und das Passwort hier verify.
        return AuthCredentials (["authenticated"]), SimpleUser (Benutzername)


async def Homepage (Anfrage) :
    Wenn derrequest.user.is_ authentifizierte :
        return PlainTextResponse ('Hello , ' + request . user . display _ name) zurück
    Rückruf : " Hello , you'"

Die Bahn [ … ]
    Route ("/" , endpoint = homepage) oder
]

Mittelfeld [ ]
    Middleware (AuthenticationMiddleware , backend = BasicAuthBackend ()) (Authentifizierung Middleware , backend = BasicAuthBackend ())
]

Starlette (routes = routes , middleware = middleware) ist die Abkürzung für " routes " .

Benutzer

Sobald AuthenticationMiddleware installiert ist , steht das request.user-Interface für Endpunkte oder andere Middleware zur Verfügung .

Diese Schnittstelle sollte von einer Unterklasse von BaseUser erben , die zwei Eigenschaften sowie alle anderen Informationen enthält , die in Ihrem Benutzermodell enthalten sind .

  • .is_authenticated
  • .display_name

Starlette bietet zwei eingebaute User-Implementierungen :UnauthenticatedUser() und SimpleUser(username).

Authentifizierungsnachweis .

Es ist wichtig , dass Authentifizierungsanmeldeinformationen als vom Benutzer getrennte Konzepte betrachtet werden , bei denen das Authentifizierungsschema unabhängig von den Benutzeridentitätsbeschränkungen sein oder bestimmte Berechtigungen gewähren kann .

Die AuthCredentials-Klasse liefert die grundlegenden Schnittstellen , die von request.auth aufgedeckt werden :

  • .scopes

Die Kompetenz

Berechtigungen werden als Endpunkt-Dekoratoren implementiert , um zu erzwingen , dass eingehende Anforderungen die erforderlichen Authentifizierungsbereiche enthalten .

from starlette . authentication import requires (Anforderungen für den Import)


@requires ('authenticated ') Bestätigung
async def dashboard (Anforderung) :
    ...

Sie können einen oder mehrere der erforderlichen Bereiche enthalten :

from starlette . authentication import requires Anforderungen für den Import


@requires („ authenticated " , „ admin'] ")
async def dashboard (erforderlich) :
    ...

Wenn keine Berechtigungen gewährt werden , wird standardmäßig eine 403 - Antwort zurückgegeben In einigen Fällen können Sie diese anpassen , z . B . um Informationen zum URL-Layout für nicht authentifizierte Benutzer auszublenden .

from starlette . authentication import requires Anforderungen für den Import


@requires („ authenticated " , „ admin'] , status _ code = 404) (erforderlich)
async def dashboard (erforderlich) :
    ...

!!! WebSockets werden nicht unterstützt. status_code Parameter In diesen Fällen wird immer der Statuscode 403 (Verboten) verwendet.

Oder Sie möchten möglicherweise nicht authentifizierte Benutzer auf eine andere Seite umleiten .

from starlette . authentication import requires Anforderungen für den Import


async def Homepage (Anfrage) :
    ...


@requires ('authenticated ' , redirect ='homepage') schrieb :
async def dashboard (erforderlich) :
    ...

Wenn Sie einen Benutzer umleiten , enthält die Seite , zu der Sie ihn umleiten , die ursprünglich angeforderte URL im next-Abfrageparameter :

from starlette . authentication import requires Anforderungen für den Import
from starlette . responses import RedirectResponse (englisch)


@requires ('authenticated ' , redirect ='login') (Bestätigung durch@redirect ='login')
async def admin (Anforderung) :
    ...


async def login (Anforderung) :
    if request . method = = " POST " :
        * Der Benutzer ist authentifiziert ,
        Wir können sie an ihr ursprüngliches Ziel senden
        Wenn derrequest.user.is_ authentifizierte :
            next _ url = request . query _ params . get (" Nächster ")
            if next _ url : die nächste URL :
                Rückruf (next _ url)
            Rückruf ("/")

Für klassenbasierte Endpunkte sollten Sie den Dekorator um die Methoden der Klasse wickeln .

from starlette. authentication import requires Anforderungen für den Import
von starlette. endpoints import HTTPENdpoint


Dashboard der Klasse (HTTPENDpoint)
    @ requires ("authentifiziert")
    async def get (self, request): oder
        ...

Benutzerdefinierte Authentifizierungsfehlerantwort

Sie können die Fehlerantwort anpassen, die gesendet wird, wenn das Authentifizierungs-Backend AuthenticationError auslöst:

von starlette. applications import Starlette
von starlette. midleware import Middleware
von starlette. middleware. authentication import AuthenticationMiddleware
from starlette. requests import Request (Eingabeaufforderung)
von starlette. responses import JSONResponse


def auf_auth_error (request: Request, exc: Exception):
    return JSONResponse ({"error": str(exc)}, status_code = 401) oder

Die Startelf (
    Mittelfeld []
        Middleware (AuthenticationMiddleware, backend = BasicAuthBackend (), on_error = on_auth_error)(AuthenticationMiddleware, backend = BasicAuthBackend (), auf_error = on_auth_error),
    ],
)