microdot.auth — Autenticación HTTP

Decoradores que protegen rutas mediante autenticación HTTP. Dos variantes: BasicAuth para el esquema Authorization: Basic <base64> que los navegadores solicitan de forma nativa, y TokenAuth para el esquema Authorization: Bearer <token> que utilizan las API.

Ambas clases derivan de una base común BaseAuth; una aplicación construye el objeto de autenticación, registra una función de retorno (callback) de autenticación con authenticate() y luego decora las rutas protegidas con la instancia de autenticación.

class BasicAuth

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

Autenticación HTTP Basic. El navegador muestra un cuadro de diálogo de nombre de usuario / contraseña cuando una solicitud no autenticada llega a una ruta protegida y envía Authorization: Basic <base64(user:pass)> en las solicitudes posteriores.

realm

La cadena de realm que el navegador muestra junto a la solicitud.

charset

Conjunto de caracteres anunciado en el desafío WWW-Authenticate.

scheme

Nombre del esquema de autenticación. Por defecto 'Basic'.

error_status

Estado HTTP devuelto cuando falla la autenticación. Por defecto 401.

authenticate(f)

Decorador que registra la verificación de credenciales. f recibe (request, username, password) y devuelve el objeto de usuario autenticado (o None si las credenciales son incorrectas). El objeto devuelto se almacena en 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)

Decorar una ruta con la instancia de BasicAuth la protege:

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

Como __call__(), pero no rechaza las solicitudes que carecen de credenciales: el controlador se ejecuta igualmente, con request.g.current_user establecido en el usuario autenticado o en None.

class TokenAuth

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

Autenticación mediante token Bearer. Los clientes envían un token en el encabezado Authorization; la aplicación lo valida contra el almacén de respaldo que prefiera.

header

El nombre del encabezado que transporta el token. El valor predeterminado 'Authorization' espera el valor Bearer <token>; un encabezado personalizado transporta el valor del token directamente.

scheme

Esquema de autenticación para el encabezado Authorization. Por defecto 'Bearer'.

error_status

Estado HTTP cuando falla la autenticación. Por defecto 401.

authenticate(f)

Decorador que registra la verificación del token. f recibe (request, token) y devuelve un objeto de usuario o 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)

Decorador que anula la respuesta 401 predeterminada. f recibe el objeto de solicitud y devuelve una respuesta (o aborta).

__call__(f: Callable) Callable

Decorar una ruta con la instancia de TokenAuth la protege. Las solicitudes sin un token válido se rechazan (401 por defecto, o lo que sea que haya devuelto errorhandler()). En caso de éxito, el usuario autenticado se encuentra en request.g.current_user:

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

Devuelve el controlador envuelto.

optional(f: Callable) Callable

Como __call__(), pero no rechaza las solicitudes que carecen de token: el controlador se ejecuta igualmente, con request.g.current_user establecido en el usuario autenticado o en None. Útil para rutas que cambian su salida según si el llamante está autenticado, sin exigirlo:

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

Devuelve el controlador envuelto.

class BaseAuth

class microdot.auth.BaseAuth

Base común para BasicAuth y TokenAuth. Los esquemas de autenticación personalizados pueden heredar de ella.

auth_callback: Callable | None

La función de retorno (callback) registrada mediante authenticate. Es None hasta que la aplicación registra la función de retorno (decorar una función con @auth.authenticate es lo que la establece).

error_callback: Callable

Callable asíncrono que devuelve la respuesta enviada cuando falla la autenticación. El constructor lo establece en un valor predeterminado que devuelve una respuesta 401; reemplácelo mediante errorhandler en TokenAuth, o directamente en una subclase personalizada de BaseAuth.

Las rutas decoradas obtienen request.g.current_user rellenado con el valor devuelto por la función de retorno de autenticación. Dentro de la ruta, inspeccione ese atributo para identificar al llamante.