FastApi: авторизированный вход
Из предыдущей статьи у нас есть некий вызов API после выполнения которого у нас на руках будет некий сессионый ключ.
Попробуем теперь используя этот сессионый ключ, запросить некую информацию о пользователе. Для этого добавим в схему auth.py классы:
1 2 3 4 5 6 7 8 9 |
class info_class(BaseModel): username : Optional[str] = Field(None, title="Имя пользователя", example="Вася Пупкин") phone : Optional[str] = Field(None, title="Номер телефона", example="+79222347594") email : Optional[str] = Field(None, title="Email пользователя", example="dowiurefh@mail.ru") class info_out(BaseModel): error : Optional[bool] = Field(..., title="Результат выполнения запроса", example="false") comment : Optional[str] = Field(None, title="Текст ошибки", example="Пользователь удалён") result : Optional[info_class] |
Следующим шагом будет защитить доступ к остальным компонентам API, от доступа без сессионного ключа. Для этого воспользуемся классом FastApi security и добавим в требования заголовка запроса тег авторизации.
Получим итоговый роутинг auth.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# -*- coding: utf-8 -*- """Different helper-functions to work with users.""" import json import fastapi; from fastapi import APIRouter,Depends from app.schemas import auth as auth_models from pydantic import BaseModel token_key = fastapi.security.APIKeyHeader(name="Authorization") class Token(BaseModel): token: str # получить текущий токен def get_current_token(oauth_header: str = fastapi.Security(token_key)): #print(f"Token: {oauth_header}") oauth_header=oauth_header.replace("Token ","") return oauth_header router = APIRouter() @router.post('/auth',response_model=auth_models.auth_out,tags=["auth"]) # заданы исходящие параметры async def auth(into = Depends(auth_models.auth_in)): # заданы входящие параметры # если параметры не заданы if into.password==None: into.password="NONE" if into.login == None: into.password = "NONE" hash="12345678" # сформируем ответ out=auth_models.auth_out(hash=hash) return out @router.post('/GetInfo',response_model=auth_models.info_out,tags=["auth"]) # заданы исходящие параметры async def GetInfo(token: Token=Depends(get_current_token)): # заданы входящие параметры print(f"Токен: {token}") if token!="12345678": print("Токен не верен!") return auth_models.info_out(error=True,comment="Токен не найден") # сформируем ответ return auth_models.info_out(error=False,result={"username":"Pavel","email":"vasya@mail.ru"}) |
В результате мы можем увидеть в документации появившийся «замочек»:
При попытке выполнения запроса без авторизации, соответственно получим ошибку аторизации:
1 |
Not authenticated |