microdot.auth — HTTP-autentisering

Dekoratorer som spärrar rutter bakom HTTP-autentisering. Två varianter: BasicAuth för schemat Authorization: Basic <base64> som webbläsare frågar efter direkt, och TokenAuth för schemat Authorization: Bearer <token> som API:er använder.

Båda klasserna härleds från en gemensam basklass BaseAuth; en applikation konstruerar autentiseringsobjektet, registrerar ett autentiseringsåteranrop med authenticate() och dekorerar sedan skyddade rutter med autentiseringsinstansen.

class BasicAuth

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

HTTP Basic-autentisering. Webbläsaren visar en dialog för användarnamn/lösenord när en oautentiserad begäran träffar en skyddad rutt och skickar Authorization: Basic <base64(user:pass)> vid efterföljande begäranden.

realm

Realm-strängen som webbläsaren visar bredvid frågan.

charset

Teckenuppsättning som annonseras i WWW-Authenticate-utmaningen.

scheme

Namn på autentiseringsschemat. Standard 'Basic'.

error_status

HTTP-status som returneras vid misslyckad autentisering. Standard 401.

authenticate(f)

Dekorator som registrerar kontrollen av inloggningsuppgifter. f tar (request, username, password) och returnerar det autentiserade användarobjektet (eller None vid felaktiga inloggningsuppgifter). Det returnerade objektet lagras i request.g.current_user.

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)

Att dekorera en rutt med BasicAuth-instansen skyddar den:

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

Som __call__(), men avvisar inte begäranden som saknar inloggningsuppgifter – hanteraren körs ändå, med request.g.current_user satt till antingen den autentiserade användaren eller None.

class TokenAuth

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

Bearer-token-autentisering. Klienter skickar en token i Authorization-huvudet; applikationen validerar den mot vilken lagring den än föredrar.

header

Namnet på huvudet som bär token. Standardvärdet 'Authorization' förväntar sig värdet Bearer <token>; ett anpassat huvud bär token-värdet direkt.

scheme

Autentiseringsschema för Authorization-huvudet. Standard 'Bearer'.

error_status

HTTP-status vid autentiseringsfel. Standard 401.

authenticate(f)

Dekorator som registrerar token-kontrollen. f tar (request, token) och returnerar ett användarobjekt eller None

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 som åsidosätter standardsvaret 401. f tar request-objektet och returnerar ett svar (eller avbryter).

__call__(f: Callable) Callable

Att dekorera en rutt med TokenAuth-instansen skyddar den. Begäranden utan en giltig token avvisas (401 som standard, eller vad errorhandler() returnerade). Vid lyckad autentisering finns den autentiserade användaren i request.g.current_user

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

Returnerar den omslutna hanteraren.

optional(f: Callable) Callable

Som __call__(), men avvisar inte begäranden som saknar en token – hanteraren körs ändå, med request.g.current_user satt till antingen den autentiserade användaren eller None. Användbart för rutter som ändrar sin utdata beroende på om anroparen är autentiserad utan att kräva det:

@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()

Returnerar den omslutna hanteraren.

class BaseAuth

class microdot.auth.BaseAuth

Gemensam bas för BasicAuth och TokenAuth. Anpassade autentiseringsscheman kan subklassa den.

auth_callback: Callable | None

Återanropet som registrerats via authenticate. None tills applikationen registrerar återanropet (att dekorera en funktion med @auth.authenticate är det som sätter det).

error_callback: Callable

Asynkront anropsbart objekt som returnerar svaret som skickas vid autentiseringsfel. Sätts av konstruktorn till ett standardvärde som returnerar ett 401-svar; ersätt det via errorhandlerTokenAuth, eller direkt på en anpassad BaseAuth-subklass.

De dekorerade rutterna får request.g.current_user ifyllt med värdet som returnerats från autentiseringsåteranropet. Inuti rutten inspekterar du det attributet för att identifiera anroparen.