FastApi: передача заголовка Authorization в header
Не тривиальная задача, которая потребовала двух дней поиска решения.
Казалось бы, всё решается просто:
1 2 3 4 5 6 7 8 9 10 |
@router.get('/versions',tags=["Credentials"],responses={ 200: { "model": List[models.versions_info], "description": "Return has code", "headers": {"Authorization": {"description":"Token party","type":"string"}} }}) async def list_versions(request: Request,token: Union[str, None] = Header(alias="Authorization",default=None)): print(token) out=[{"version": "2.1.1","url": "https://www.server.com/ocpi/2.1.1/"},{"version": "2.2","url": "https://www.server.com/ocpi/2.2/"}] return Response(status_code=200,content=json.dumps(out), media_type="application/json", headers={"Authorization": "Token "+config.globals['mytoken']}) |
Однако вместо ожидаемой передачи заголовка, curl в упор возвращает ровно ничего:
Гугл помог выяснить, что ключевое слово Authorization зарезервированно для использования в Header. На https://stackoverflow.com было подсказано и направление куда копать. А именно, использовать обертку Security:
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 |
router = APIRouter() 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}") return oauth_header # выдаем список поддерживаемых версий @router.get('/versions',tags=["Credentials"],responses={ 200: { "model": List[models.versions_info], "description": "Return has code", "headers": {"Authorization": {"description":"Токен участника для авторизации","type":"string"}} }, 401: { "description": "Unauthorized status code.", } }) async def list_versions(request: Request,token: funcs.Token = Depends(funcs.get_current_token)): # запрос на получение поддерживаемых версий ПО print(f"Токен:{token}") if token==None: return Response(status_code=401, content="Unauthorized status code.", media_type="application/text") out=[{"version": "2.1.1","url": "https://www.server.com/ocpi/2.1.1/"},{"version": "2.2","url": "https://www.server.com/ocpi/2.2/"}] return Response(status_code=200,content=json.dumps(out), media_type="application/json", headers={"Authorization": "Token "+config.globals['mytoken']}) |