microdot.auth — HTTP-Authentifizierung

Dekoratoren, die Routen hinter eine HTTP-Authentifizierung stellen. Zwei Varianten: BasicAuth für das Schema Authorization: Basic <base64>, nach dem Browser nativ fragen, und TokenAuth für das Schema Authorization: Bearer <token>, das APIs verwenden.

Beide Klassen leiten sich von einer gemeinsamen Basisklasse BaseAuth ab; eine Anwendung erzeugt das Auth-Objekt, registriert mit authenticate() einen Authentifizierungs-Callback und dekoriert dann geschützte Routen mit der Auth-Instanz.

class BasicAuth

class microdot.auth.BasicAuth(realm: str = 'Please login', charset: str = 'UTF-8', scheme: str = 'Basic', error_status: int = 401)

HTTP Basic-Authentifizierung. Der Browser öffnet ein Dialogfenster für Benutzername / Passwort, wenn eine nicht authentifizierte Anfrage auf eine geschützte Route trifft, und sendet bei nachfolgenden Anfragen Authorization: Basic <base64(user:pass)>.

realm

Die Realm-Zeichenkette, die der Browser neben der Eingabeaufforderung anzeigt.

charset

Der im WWW-Authenticate-Challenge angegebene Zeichensatz.

scheme

Name des Authentifizierungsschemas. Standard 'Basic'.

error_status

HTTP-Status, der bei fehlgeschlagener Authentifizierung zurückgegeben wird. Standard 401.

authenticate(f)

Dekorator, der die Anmeldedatenprüfung registriert. f erhält (request, username, password) und gibt das authentifizierte Benutzerobjekt zurück (oder None bei ungültigen Anmeldedaten). Das zurückgegebene Objekt wird in request.g.current_user gespeichert.

basic = BasicAuth(realm='Camera')

@basic.authenticate
async def check(request, username, password):
    user = users.get(username)
    if user and user.check_password(password):
        return user
__call__(f)

Das Dekorieren einer Route mit der BasicAuth-Instanz schützt sie:

@app.route('/admin')
@basic
def admin(request):
    return 'hello ' + request.g.current_user.name
optional(f)

Wie __call__(), aber Anfragen ohne Anmeldedaten werden nicht abgelehnt – der Handler wird trotzdem ausgeführt, wobei request.g.current_user entweder auf den authentifizierten Benutzer oder auf None gesetzt ist.

class TokenAuth

class microdot.auth.TokenAuth(header: str = 'Authorization', scheme: str = 'Bearer', error_status: int = 401)

Bearer-Token-Authentifizierung. Clients senden ein Token im Authorization-Header; die Anwendung validiert es gegen den von ihr bevorzugten Speicher.

header

Der Name des Headers, der das Token trägt. Der Standard 'Authorization' erwartet den Wert Bearer <token>; ein benutzerdefinierter Header trägt den Token-Wert direkt.

scheme

Auth-Schema für den Authorization-Header. Standard 'Bearer'.

error_status

HTTP-Status bei Authentifizierungsfehler. Standard 401.

authenticate(f)

Dekorator, der die Token-Prüfung registriert. f erhält (request, token) und gibt ein Benutzerobjekt oder None zurück:

import jwt

tokens = TokenAuth()

@tokens.authenticate
async def check(request, token):
    try:
        claims = jwt.decode(token, SECRET)
    except jwt.exceptions.PyJWTError:
        return None
    return claims['sub']
errorhandler(f)

Dekorator, der die standardmäßige 401-Antwort überschreibt. f erhält das Anfrageobjekt und gibt eine Antwort zurück (oder bricht ab).

__call__(f: Callable) Callable

Das Dekorieren einer Route mit der TokenAuth-Instanz schützt sie. Anfragen ohne gültiges Token werden abgelehnt (standardmäßig 401, oder was auch immer errorhandler() zurückgegeben hat). Bei Erfolg befindet sich der authentifizierte Benutzer in request.g.current_user:

@app.get('/api/me')
@tokens
async def me(request):
    return {'user': request.g.current_user}

Gibt den umschlossenen Handler zurück.

optional(f: Callable) Callable

Wie __call__(), aber Anfragen ohne Token werden nicht abgelehnt – der Handler wird trotzdem ausgeführt, wobei request.g.current_user entweder auf den authentifizierten Benutzer oder auf None gesetzt ist. Nützlich für Routen, die ihre Ausgabe abhängig davon ändern, ob der Aufrufer authentifiziert ist, ohne dies zu erfordern:

@app.get('/api/feed')
@tokens.optional
async def feed(request):
    if request.g.current_user:
        return personalized_feed(request.g.current_user)
    return public_feed()

Gibt den umschlossenen Handler zurück.

class BaseAuth

class microdot.auth.BaseAuth

Gemeinsame Basis für BasicAuth und TokenAuth. Benutzerdefinierte Auth-Schemata können davon ableiten.

auth_callback: Callable | None

Der über authenticate registrierte Callback. None, bis die Anwendung den Callback registriert (das Dekorieren einer Funktion mit @auth.authenticate setzt ihn).

error_callback: Callable

Asynchrones Callable, das die bei einem Authentifizierungsfehler gesendete Antwort zurückgibt. Wird vom Konstruktor auf einen Standardwert gesetzt, der eine 401-Antwort zurückgibt; ersetze es über errorhandler bei TokenAuth oder direkt in einer benutzerdefinierten BaseAuth-Unterklasse.

Bei den dekorierten Routen wird request.g.current_user mit dem vom Authentifizierungs-Callback zurückgegebenen Wert gefüllt. Untersuche innerhalb der Route dieses Attribut, um den Aufrufer zu identifizieren.