FastAPI — это современный веб-фреймворк для разработки API на языке Python. Он облегчает создание быстрых и надежных приложений благодаря использованию современных технологий, таких как асинхронность и типизация данных. В данной статье мы рассмотрим, как интегрировать FastAPI с протоколами аутентификации и авторизации OAuth2 и OpenID Connect.
Что такое OAuth2 и OpenID Connect?
OAuth2 — это протокол, позволяющий пользователям авторизоваться в приложении через сторонних провайдеров, таких как Facebook или Google. В результате, приложение получает доступ к определенным ресурсам на сторонних сервисах от имени пользователя.
OpenID Connect — это расширение протокола OAuth2, добавляющее слой аутентификации пользователя. Это позволяет приложению удостовериться в идентичности пользователя и получить доступ к его профилю и другой личной информации.
Интеграция с OAuth2
FastAPI поддерживает различные стратегии аутентификации, включая стратегию OAuth2. Для того, чтобы интегрировать приложение с OAuth2, необходимо выполнить следующие шаги:
- Определить настройки OAuth2, включая список разрешенных провайдеров и параметры авторизации.
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def get_current_user(token: str = Depends(oauth2_scheme)):
# реализация проверки токена и получения информации о пользователе
...
- Создать обработчики эндпоинтов, которые используют механизм OAuth2 для аутентификации пользователей.
@app.get("/protected")
async def protected_route(current_user: User = Depends(get_current_user)):
# реализация защищенного ресурса
...
- Предоставить пользователям доступ к странице авторизации стороннего провайдера.
@app.get("/login/{provider}")
async def login(provider: str):
# реализация редиректа на страницу авторизации провайдера
...
Интеграция с OpenID Connect
FastAPI поддерживает интеграцию с протоколом OpenID Connect, позволяющим пользователям аутентифицироваться и авторизоваться в приложении. Для того, чтобы интегрировать FastAPI с OpenID Connect, необходимо выполнить следующие шаги:
- Установить необходимые зависимости для работы с OpenID Connect.
pip install pyjwt jwcrypto aiohttp requests requests_cache
- Определить настройки OpenID Connect, включая адреса авторизации, токенов и информацию о клиенте.
from fastapi.security import OAuth2AuthorizationCodeBearer
from fastapi_login import LoginManager
from fastapi_login.exceptions import InvalidCredentialsException
app = FastAPI()
SECRET = "my_secret_key"
OIDC_URL = "https://my-oidc-provider.com"
OIDC_CLIENT_ID = "my_client_id"
OIDC_CLIENT_SECRET = "my_client_secret"
OIDC_REDIRECT_URI = "http://localhost:8000/auth/callback"
login_manager = LoginManager(SECRET, "/auth/token")
oauth2_scheme = OAuth2AuthorizationCodeBearer(
authorizationUrl=f"{OIDC_URL}/authorize",
tokenUrl=f"{OIDC_URL}/token",
clientId=OIDC_CLIENT_ID,
clientSecret=OIDC_CLIENT_SECRET,
redirectUri=OIDC_REDIRECT_URI
)
- Создать эндпоинты для авторизации и обработки колбека после аутентификации.
@app.get("/auth/login")
async def login():
authorization_url = oauth2_scheme.authorizationUrl
return RedirectResponse(authorization_url)
@app.get("/auth/callback")
async def callback(code: str):
access_token = await oauth2_scheme.get_access_token(code)
# реализация получения информации о пользователе
...
- Реализовать функцию получения информации о пользователе с помощью токена OpenID Connect.
async def get_user_info(access_token: str):
headers = {"Authorization": f"Bearer {access_token}"}
async with aiohttp.ClientSession() as session:
async with session.get(f"{OIDC_URL}/userinfo", headers=headers) as resp:
data = await resp.json()
return data
- Использовать информацию о пользователе для аутентификации и авторизации.
@login_manager.user_loader
async def load_user(user_id: str):
user_info = await get_user_info(user_id)
# реализация получения пользователя из базы данных или создание нового пользователя
...
@app.get("/protected")
async def protected_route(current_user: User = Depends(login_manager)):
# реализация защищенного ресурса
...
Таким образом, мы можем интегрировать FastAPI с протоколом OpenID Connect и использовать его для аутентификации и авторизации пользователей в приложении.