FastApi: передача заголовка Authorization в header
Не тривиальная задача, которая потребовала двух дней поиска решения.
Казалось бы, всё решается просто:
@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:
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']})
