microdot.auth — authentification HTTP

Décorateurs qui protègent les routes derrière une authentification HTTP. Deux variantes : BasicAuth pour le schéma Authorization: Basic <base64> que les navigateurs proposent nativement, et TokenAuth pour le schéma Authorization: Bearer <token> utilisé par les API.

Les deux classes dérivent d’une base commune BaseAuth ; une application construit l’objet d’authentification, enregistre une fonction de rappel d’authentification avec authenticate(), puis décore les routes protégées avec l’instance d’authentification.

class BasicAuth

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

Authentification HTTP Basic. Le navigateur affiche une boîte de dialogue nom d’utilisateur / mot de passe lorsqu’une requête non authentifiée atteint une route protégée et envoie Authorization: Basic <base64(user:pass)> lors des requêtes suivantes.

realm

La chaîne realm que le navigateur affiche à côté de l’invite.

charset

Jeu de caractères annoncé dans le défi WWW-Authenticate.

scheme

Nom du schéma d’authentification. Par défaut 'Basic'.

error_status

Statut HTTP renvoyé en cas d’échec de l’authentification. Par défaut 401.

authenticate(f)

Décorateur qui enregistre la vérification des identifiants. f prend (request, username, password) et renvoie l’objet utilisateur authentifié (ou None en cas de mauvais identifiants). L’objet renvoyé est stocké dans 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)

Décorer une route avec l’instance BasicAuth la protège

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

Comme __call__(), mais ne rejette pas les requêtes dépourvues d’identifiants – le gestionnaire s’exécute quand même, avec request.g.current_user défini soit sur l’utilisateur authentifié, soit sur None.

class TokenAuth

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

Authentification par jeton Bearer. Les clients envoient un jeton dans l’en-tête Authorization ; l’application le valide auprès du magasin de son choix.

header

Le nom de l’en-tête portant le jeton. La valeur par défaut 'Authorization' attend la valeur Bearer <token> ; un en-tête personnalisé porte directement la valeur du jeton.

scheme

Schéma d’authentification pour l’en-tête Authorization. Par défaut 'Bearer'.

error_status

Statut HTTP en cas d’échec d’authentification. Par défaut 401.

authenticate(f)

Décorateur qui enregistre la vérification du jeton. f prend (request, token) et renvoie un objet utilisateur ou 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)

Décorateur qui remplace la réponse 401 par défaut. f prend l’objet requête et renvoie une réponse (ou interrompt).

__call__(f: Callable) Callable

Décorer une route avec l’instance TokenAuth la protège. Les requêtes sans jeton valide sont rejetées (401 par défaut, ou ce que errorhandler() a renvoyé). En cas de succès, l’utilisateur authentifié se trouve dans request.g.current_user

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

Renvoie le gestionnaire enveloppé.

optional(f: Callable) Callable

Comme __call__(), mais ne rejette pas les requêtes dépourvues de jeton – le gestionnaire s’exécute quand même, avec request.g.current_user défini soit sur l’utilisateur authentifié, soit sur None. Utile pour les routes qui modifient leur sortie selon que l’appelant est authentifié ou non sans l’exiger

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

Renvoie le gestionnaire enveloppé.

class BaseAuth

class microdot.auth.BaseAuth

Base commune pour BasicAuth et TokenAuth. Les schémas d’authentification personnalisés peuvent en hériter.

auth_callback: Callable | None

La fonction de rappel enregistrée via authenticate. None tant que l’application n’enregistre pas la fonction de rappel (décorer une fonction avec @auth.authenticate est ce qui la définit).

error_callback: Callable

Appelable asynchrone renvoyant la réponse envoyée en cas d’échec d’authentification. Définie par le constructeur sur une valeur par défaut qui renvoie une réponse 401 ; remplacez-la via errorhandler sur TokenAuth, ou directement sur une sous-classe BaseAuth personnalisée.

Les routes décorées reçoivent request.g.current_user rempli avec la valeur renvoyée par la fonction de rappel d’authentification. À l’intérieur de la route, inspectez cet attribut pour identifier l’appelant.