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, заполненный значением, возвращённым функцией обратного вызова аутентификации. Внутри маршрута проверьте этот атрибут, чтобы идентифицировать вызывающего.