microdot.auth — HTTP-автентифікація

Декоратори, що захищають маршрути за допомогою HTTP-автентифікації. Два варіанти: BasicAuth для схеми Authorization: Basic <base64>, яку браузери запитують нативно, та TokenAuth для схеми Authorization: Bearer <token>, що використовується у API.

Обидва класи успадковуються від спільного базового класу BaseAuth; застосунок створює об’єкт автентифікації, реєструє зворотний виклик автентифікації через authenticate(), а потім декорує захищені маршрути цим екземпляром.

class BasicAuth

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

HTTP Basic автентифікація. Браузер відображає діалог введення імені користувача і пароля, коли неавтентифікований запит потрапляє на захищений маршрут, і надсилає Authorization: Basic <base64(user:pass)> у подальших запитах.

realm

Рядок realm, який браузер відображає поруч із підказкою.

charset

Кодування, оголошене у виклику WWW-Authenticate.

scheme

Назва схеми автентифікації. За замовчуванням 'Basic'.

error_status

HTTP-статус, що повертається при невдалій автентифікації. За замовчуванням 401.

authenticate(f)

Декоратор, що реєструє перевірку облікових даних. f приймає (request, username, password) і повертає автентифікований об’єкт користувача (або None при невірних даних). Повернутий об’єкт зберігається у 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)

Декорування маршруту екземпляром BasicAuth захищає його:

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

Подібно до __call__(), але не відхиляє запити без облікових даних — обробник все одно виконується, а request.g.current_user встановлюється або як автентифікований користувач, або як None.

class TokenAuth

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

Автентифікація за Bearer-токеном. Клієнти надсилають токен у заголовку Authorization; застосунок перевіряє його у будь-якому сховищі за своїм вибором.

header

Назва заголовка, що містить токен. За замовчуванням 'Authorization' очікує значення Bearer <token>; власний заголовок несе значення токена безпосередньо.

scheme

Схема автентифікації для заголовка Authorization. За замовчуванням 'Bearer'.

error_status

HTTP-статус при помилці автентифікації. За замовчуванням 401.

authenticate(f)

Декоратор, що реєструє перевірку токена. f приймає (request, token) і повертає об’єкт користувача або 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)

Декоратор, що перевизначає типову відповідь 401. f приймає об’єкт запиту і повертає відповідь (або перериває виконання).

__call__(f: Callable) Callable

Декорування маршруту екземпляром TokenAuth захищає його. Запити без дійсного токена відхиляються (401 за замовчуванням, або те, що повертає errorhandler()). При успіху автентифікований користувач зберігається у request.g.current_user

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

Повертає обгорнутий обробник.

optional(f: Callable) Callable

Подібно до __call__(), але не відхиляє запити без токена — обробник все одно виконується, а request.g.current_user встановлюється або як автентифікований користувач, або як None. Корисно для маршрутів, що змінюють вивід залежно від того, чи автентифіковано абонента, без обов’язкової автентифікації:

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

Повертає обгорнутий обробник.

class BaseAuth

class microdot.auth.BaseAuth

Спільний базовий клас для BasicAuth та TokenAuth. Власні схеми автентифікації можуть успадковуватися від нього.

auth_callback: Callable | None

Зворотний виклик, зареєстрований через authenticate. None до реєстрації зворотного виклику застосунком (декорування функції через @auth.authenticate і є таким встановленням).

error_callback: Callable

Асинхронний виклик, що повертає відповідь при невдалій автентифікації. Встановлюється конструктором за замовчуванням як відповідь 401; замінюється через errorhandler у TokenAuth або безпосередньо у власному підкласі BaseAuth.

Декоровані маршрути отримують request.g.current_user, заповнений значенням, поверненим зворотним викликом автентифікації. Всередині маршруту цей атрибут слугує для ідентифікації абонента.