microdot.auth — HTTP autentizace

Dekorátory, které chrání trasy za HTTP autentizací. Dvě varianty: BasicAuth pro schéma Authorization: Basic <base64>, na které se prohlížeče nativně ptají, a TokenAuth pro schéma Authorization: Bearer <token>, které používají API.

Obě třídy odvozují ze společné základní třídy BaseAuth; aplikace vytvoří autentizační objekt, zaregistruje autentizační callback pomocí authenticate() a poté chráněné trasy dekoruje instancí autentizace.

class BasicAuth

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

HTTP Basic autentizace. Prohlížeč zobrazí dialog s uživatelským jménem / heslem, když neautentizovaný požadavek narazí na chráněnou trasu, a u následujících požadavků odesílá Authorization: Basic <base64(user:pass)>.

realm

Řetězec realm, který prohlížeč zobrazí vedle výzvy.

charset

Znaková sada inzerovaná ve výzvě WWW-Authenticate.

scheme

Název autentizačního schématu. Výchozí 'Basic'.

error_status

HTTP status vrácený při neúspěšné autentizaci. Výchozí 401.

authenticate(f)

Dekorátor, který registruje kontrolu přihlašovacích údajů. f přijímá (request, username, password) a vrací autentizovaný uživatelský objekt (nebo None při nesprávných údajích). Vrácený objekt je uložen v 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)

Dekorování trasy instancí BasicAuth ji chrání:

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

Jako __call__(), ale neodmítá požadavky, které postrádají přihlašovací údaje – handler se přesto spustí, přičemž request.g.current_user je nastaveno buď na autentizovaného uživatele, nebo na None.

class TokenAuth

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

Autentizace pomocí Bearer tokenu. Klienti odesílají token v hlavičce Authorization; aplikace jej ověří vůči libovolnému úložišti, které jí vyhovuje.

header

Název hlavičky nesoucí token. Výchozí 'Authorization' očekává hodnotu Bearer <token>; vlastní hlavička nese hodnotu tokenu přímo.

scheme

Autentizační schéma pro hlavičku Authorization. Výchozí 'Bearer'.

error_status

HTTP status při selhání autentizace. Výchozí 401.

authenticate(f)

Dekorátor, který registruje kontrolu tokenu. f přijímá (request, token) a vrací uživatelský objekt nebo 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)

Dekorátor, který přepisuje výchozí odpověď 401. f přijímá objekt požadavku a vrací odpověď (nebo přeruší zpracování).

__call__(f: Callable) Callable

Dekorování trasy instancí TokenAuth ji chrání. Požadavky bez platného tokenu jsou odmítnuty (ve výchozím nastavení 401, nebo cokoli vrátil errorhandler()). Při úspěchu je autentizovaný uživatel v request.g.current_user

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

Vrátí obalený handler.

optional(f: Callable) Callable

Jako __call__(), ale neodmítá požadavky, které postrádají token – handler se přesto spustí, přičemž request.g.current_user je nastaveno buď na autentizovaného uživatele, nebo na None. Užitečné pro trasy, které mění svůj výstup podle toho, zda je volající autentizován, aniž by to vyžadovaly:

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

Vrátí obalený handler.

class BaseAuth

class microdot.auth.BaseAuth

Společný základ pro BasicAuth a TokenAuth. Vlastní autentizační schémata jej mohou rozšířit.

auth_callback: Callable | None

Callback registrovaný přes authenticate. None, dokud aplikace callback nezaregistruje (nastavuje jej dekorování funkce pomocí @auth.authenticate).

error_callback: Callable

Asynchronní volatelný objekt vracející odpověď odeslanou při selhání autentizace. Konstruktorem nastaven na výchozí hodnotu, která vrací odpověď 401; nahraďte jej pomocí errorhandler na TokenAuth nebo přímo na vlastní podtřídě BaseAuth.

Dekorovaným trasám se request.g.current_user naplní hodnotou vrácenou z autentizačního callbacku. Uvnitř trasy zkontrolujte tento atribut k identifikaci volajícího.