microdot.auth — autentificare HTTP

Decoratori care restricționează rutele în spatele autentificării HTTP. Două variante: BasicAuth pentru schema Authorization: Basic <base64> pe care browserele o solicită nativ și TokenAuth pentru schema Authorization: Bearer <token> folosită de API-uri.

Ambele clase derivă dintr-o bază comună BaseAuth; o aplicație construiește obiectul de autentificare, înregistrează o funcție de retroapelare (callback) de autentificare cu authenticate(), apoi decorează rutele protejate cu instanța de autentificare.

class BasicAuth

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

Autentificare HTTP Basic. Browserul afișează un dialog de nume de utilizator / parolă atunci când o cerere neautentificată ajunge la o rută protejată și trimite Authorization: Basic <base64(user:pass)> în cererile ulterioare.

realm

Șirul realm pe care browserul îl afișează lângă prompt.

charset

Setul de caractere anunțat în provocarea WWW-Authenticate.

scheme

Numele schemei de autentificare. Implicit 'Basic'.

error_status

Statusul HTTP returnat la o autentificare eșuată. Implicit 401.

authenticate(f)

Decorator care înregistrează verificarea credențialelor. f primește (request, username, password) și returnează obiectul utilizator autentificat (sau None la credențiale incorecte). Obiectul returnat este stocat în 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)

Decorarea unei rute cu instanța BasicAuth o protejează:

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

Asemănător cu __call__(), dar nu respinge cererile care nu au credențiale – handlerul rulează în continuare, cu request.g.current_user setat fie la utilizatorul autentificat, fie la None.

class TokenAuth

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

Autentificare cu token de tip Bearer. Clienții trimit un token în antetul Authorization; aplicația îl validează față de orice depozit de stocare dorește.

header

Numele antetului care transportă tokenul. Valoarea implicită 'Authorization' așteaptă valoarea Bearer <token>; un antet personalizat transportă direct valoarea tokenului.

scheme

Schema de autentificare pentru antetul Authorization. Implicit 'Bearer'.

error_status

Statusul HTTP la eșecul autentificării. Implicit 401.

authenticate(f)

Decorator care înregistrează verificarea tokenului. f primește (request, token) și returnează un obiect utilizator sau 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)

Decorator care suprascrie răspunsul implicit 401. f primește obiectul cerere și returnează un răspuns (sau abandonează).

__call__(f: Callable) Callable

Decorarea unei rute cu instanța TokenAuth o protejează. Cererile fără un token valid sunt respinse (implicit 401 sau orice a returnat errorhandler()). În caz de succes, utilizatorul autentificat se află în request.g.current_user

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

Returnează handlerul împachetat.

optional(f: Callable) Callable

Asemănător cu __call__(), dar nu respinge cererile care nu au un token – handlerul rulează în continuare, cu request.g.current_user setat fie la utilizatorul autentificat, fie la None. Util pentru rutele care își schimbă ieșirea în funcție de faptul dacă apelantul este autentificat, fără a impune acest lucru:

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

Returnează handlerul împachetat.

class BaseAuth

class microdot.auth.BaseAuth

Bază comună pentru BasicAuth și TokenAuth. Schemele de autentificare personalizate o pot extinde prin moștenire.

auth_callback: Callable | None

Funcția de retroapelare (callback) înregistrată prin authenticate. None până când aplicația înregistrează callback-ul (decorarea unei funcții cu @auth.authenticate este ceea ce o setează).

error_callback: Callable

Apelabil asincron care returnează răspunsul trimis la eșecul autentificării. Setat de constructor la o valoare implicită care returnează un răspuns 401; înlocuiește-l prin errorhandler pe TokenAuth sau direct pe o subclasă personalizată BaseAuth.

Rutele decorate primesc request.g.current_user populat cu valoarea returnată de funcția de retroapelare (callback) de autentificare. În interiorul rutei, inspectează acest atribut pentru a identifica apelantul.