Authlib – аутентификация OAuth и OpenID

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Современные веб-приложения и API требуют надежной и гибкой системы аутентификации. OAuth 2.0 и OpenID Connect стали де-факто стандартами для этой задачи. Однако их реализация требует соблюдения множества тонкостей безопасности. Библиотека Authlib была создана, чтобы упростить этот процесс в Python.

Authlib – аутентификация OAuth и OpenID позволяет быстро и безопасно интегрировать аутентификацию через сторонние сервисы, а также создать собственный OAuth-сервер. В этой статье мы рассмотрим, как использовать Authlib на практике, какие возможности она предоставляет и как избежать распространенных ошибок.

Основы OAuth и OpenID Connect

Принципы работы протоколов

OAuth 2.0 — это протокол авторизации, позволяющий приложению получать доступ к ресурсам пользователя без передачи его логина и пароля. Вместо этого используются временные токены.

OpenID Connect (OIDC) — расширение OAuth, добавляющее слой аутентификации. С помощью него можно не только получить доступ, но и подтвердить личность пользователя.

Разница между OAuth и OpenID

  • OAuth позволяет получить доступ к API (например, список файлов в Google Drive).

  • OpenID Connect предоставляет информацию о пользователе (email, имя и т.д.).

Обзор библиотеки Authlib

История и цели проекта

Authlib создан Чен Цзюньхуэем, автором проекта oauthlib. В отличие от многих других библиотек, Authlib предлагает единый API для клиента и сервера, а также поддержку последних стандартов безопасности.

Почему стоит использовать Authlib

  • Поддержка OAuth 1.0, OAuth 2.0, OpenID Connect

  • Готовые интеграции с Flask и Starlette

  • Работа с JWT, JWK, PKCE, scopes, claims

  • Простота и безопасность по умолчанию

Установка и базовая настройка Authlib

bash
pip install Authlib

Инициализация

Пример инициализации клиента:

python
from authlib.integrations.requests_client import OAuth2Session client = OAuth2Session( client_id='...', client_secret='...', redirect_uri='https://yourapp.com/auth/callback' )

Authlib и OAuth-клиент

Аутентификация через Google или GitHub

python
authorization_endpoint = 'https://accounts.google.com/o/oauth2/auth' token_endpoint = 'https://oauth2.googleapis.com/token' client = OAuth2Session(client_id, client_secret, redirect_uri) uri, state = client.create_authorization_url(authorization_endpoint) # Затем получаем код авторизации и обмениваем его на токен token = client.fetch_token(token_endpoint, authorization_response=callback_url)

Работа с access_token и refresh_token

Токен можно использовать для запросов к API:

python
response = client.get('https://www.googleapis.com/oauth2/v1/userinfo') print(response.json())

Authlib и OpenID Connect

Получение id_token и claims

OIDC возвращает id_token, который можно декодировать с помощью Authlib:

python
from authlib.jose import jwt claims = jwt.decode(id_token, key=public_key)

Проверка подписей и сроков действия

python
claims.validate()

Интеграция с Flask

Пошаговая настройка клиента

python
from flask import Flask, redirect, url_for from authlib.integrations.flask_client import OAuth app = Flask(__name__) app.secret_key = 'secret' oauth = OAuth(app) google = oauth.register( name='google', client_id='...', client_secret='...', access_token_url='https://oauth2.googleapis.com/token', access_token_params=None, authorize_url='https://accounts.google.com/o/oauth2/auth', authorize_params=None, client_kwargs={'scope': 'openid email profile'}, ) @app.route('/login') def login(): return google.authorize_redirect(redirect_uri='/auth') @app.route('/auth') def auth(): token = google.authorize_access_token() user = google.parse_id_token(token) return f'Hello {user["email"]}'

Интеграция с FastAPI

В FastAPI Authlib можно интегрировать через Starlette:

python
from authlib.integrations.starlette_client import OAuth oauth = OAuth() oauth.register(...)

Затем использовать dependency для защиты маршрутов.

Работа с собственным OAuth сервером

Настройка grant flows

Authlib поддерживает:

  • Authorization Code

  • Client Credentials

  • Password Grant

  • Refresh Token

python
from authlib.integrations.flask_oauth2 import AuthorizationServer

Scopes и permissions

Scopes позволяют ограничить доступ клиента к конкретным данным.

Безопасность и лучшие практики

  • Используйте HTTPS всегда

  • Храните client_secret в переменных окружения

  • Проверяйте state и nonce при каждом запросе

  • Используйте короткоживущие access_token

Обработка ошибок и отладка

Типичные ошибки

  • Invalid client credentials

  • Token expired

  • Redirect mismatch

Отладка

Включайте debug=True во Flask и логируйте входящие запросы.

Тестирование OAuth и OpenID в Authlib

Для тестирования удобно использовать mock-серверы или инструменты вроде oauth2-mock-server.

Можно тестировать ручками через TestClient и сохранять токены в фикстурах.

Сравнение с другими библиотеками

Библиотека Особенности Минусы
Authlib Поддержка клиента и сервера, OpenID Новый синтаксис для новичков
Requests-OAuthlib Только клиент, простой Нет поддержки OpenID Connect
python-social-auth Много интеграций Сложнее кастомизировать

Расширенные возможности Authlib

  • Работа с JWK и JWT

  • Поддержка OpenID Discovery

  • Интеграция PKCE

  • Возможность реализовать кастомные claims

Кто использует Authlib

Authlib используется в проектах Python-экосистемы, включая Flask, FastAPI, Starlette. Некоторые крупные компании выбирают Authlib за его безопасность и гибкость.

Будущее проекта и развитие

Authlib активно развивается, с регулярными обновлениями, документацией и поддержкой новых протоколов.

Планы на будущее включают улучшение поддержки OAuth 2.1 и упрощение интеграции с FastAPI.

Часто задаваемые вопросы (FAQ)

1. Что такое Authlib?
Библиотека для OAuth и OpenID Connect в Python, поддерживает клиента и сервера.

2. Можно ли использовать Authlib с FastAPI?
Да, есть готовая интеграция через Starlette.

3. Поддерживает ли Authlib OpenID Connect?
Да, включая id_token, claims и Discovery.

4. Безопасно ли использовать Authlib в продакшене?
Да, при соблюдении рекомендаций безопасности.

5. Как настроить клиента Google OAuth?
Через интерфейс Google Cloud Console с указанием redirect URL.

6. Могу ли я создать собственный OAuth сервер с Authlib?
Да, Authlib поддерживает реализацию сервера с полным контролем.

Полный справочник по ключевым функциям библиотеки Authlib для Python

Установка

bash
pip install Authlib

Дополнительно (для Flask-примера):

bash
pip install flask

Основные компоненты

Компонент Назначение
authlib.integrations.flask_client OAuth-клиенты для Flask.
authlib.integrations.starlette_client OAuth-клиенты для Starlette/FastAPI.
authlib.oauth2 Построение собственных OAuth2-серверов.
authlib.jose Работа с JWT, JWS, JWK, JWE.

1. OAuth 2.0 клиент для Flask

python
from flask import Flask, redirect, url_for from authlib.integrations.flask_client import OAuth app = Flask(__name__) app.secret_key = 'секрет' oauth = OAuth(app) google = oauth.register( name='google', client_id='ВАШ_CLIENT_ID', client_secret='ВАШ_SECRET', access_token_url='https://oauth2.googleapis.com/token', access_token_params=None, authorize_url='https://accounts.google.com/o/oauth2/v2/auth', authorize_params=None, api_base_url='https://www.googleapis.com/oauth2/v1/', client_kwargs={'scope': 'openid email profile'} ) @app.route('/') def homepage(): return '<a href="/login">Войти через Google</a>' @app.route('/login') def login(): redirect_uri = url_for('auth', _external=True) return google.authorize_redirect(redirect_uri) @app.route('/auth') def auth(): token = google.authorize_access_token() user = google.get('userinfo').json() return f"Привет, {user['name']}"

2. OAuth 2.0 клиент для FastAPI

bash
pip install fastapi uvicorn
python
from fastapi import FastAPI, Request from authlib.integrations.starlette_client import OAuth from starlette.responses import RedirectResponse app = FastAPI() oauth = OAuth() oauth.register( name='github', client_id='ВАШ_ID', client_secret='ВАШ_SECRET', access_token_url='https://github.com/login/oauth/access_token', authorize_url='https://github.com/login/oauth/authorize', api_base_url='https://api.github.com/', client_kwargs={'scope': 'user:email'}, ) @app.get('/') async def home(): return RedirectResponse('/login') @app.get('/login') async def login(request: Request): redirect_uri = request.url_for('auth') return await oauth.github.authorize_redirect(request, redirect_uri) @app.get('/auth') async def auth(request: Request): token = await oauth.github.authorize_access_token(request) user = await oauth.github.get('user', token=token) return {"name": user.json()['login']}

3. Создание и проверка JWT

python
from authlib.jose import jwt header = {'alg': 'HS256'} payload = {'user_id': 123} key = 'секрет' token = jwt.encode(header, payload, key) print(token) decoded = jwt.decode(token, key) print(decoded)

4. Создание собственного OAuth2-сервера

Authlib предоставляет базовые классы для создания авторизационного сервера, включая:

  • AuthorizationServer

  • ClientCredentialsGrant

  • AuthorizationCodeGrant

  • ResourceProtector

Используется с любой БД и веб-фреймворком. Пример сложный и требует дополнительной настройки (регистрация клиента, выдача токена, проверка токена).


5. Интеграция с Django

bash
pip install django authlib

Можно использовать Authlib в Django через стандартный OAuth2Session:

python
from authlib.integrations.requests_client import OAuth2Session session = OAuth2Session(client_id, client_secret, scope='profile') uri, state = session.create_authorization_url('https://provider.com/oauth/authorize') # перенаправляем пользователя на uri # после авторизации: token = session.fetch_token('https://provider.com/oauth/token', authorization_response=request.get_full_path())

Работа с JWK (JSON Web Key)

python
from authlib.jose import JsonWebKey jwk = JsonWebKey.generate_key(kty='RSA', crv_or_size=2048, is_private=True) print(jwk.as_dict())

Поддержка стандартов

Стандарт Поддержка
OAuth 1.0a / 2.0 Да
OpenID Connect Да
JWT / JWS / JWK / JWE Да
Proof Key for Code Exchange (PKCE) Да
ASGI / WSGI совместимость Да

Когда использовать Authlib

  • Когда нужно добавить OAuth 2.0 авторизацию через Google, GitHub, VK, Discord и др.

  • Когда нужно реализовать собственный OAuth2/OpenID-сервер.

  • Когда нужно работать с JWT, JWS и криптографией.

  • Когда разрабатываешь современные API и SPA с внешней авторизацией.

Заключение

Authlib — мощный инструмент для реализации современной аутентификации в Python. Он упрощает подключение сторонних провайдеров через OAuth, предоставляет поддержку OpenID Connect и позволяет создавать собственные безопасные OAuth-серверы.

Если вам нужно быстро настроить логин через Google, GitHub или реализовать собственный сервер — Authlib станет отличным выбором. Учитывая активное развитие и совместимость с Flask и FastAPI, он становится стандартом де-факто в Python-среде для OAuth и OpenID.