Следуя документации Starlette (FastAPI использует Starlette для промежуточного ПО), response.headers["Authorization"]
должен позволить мне получить токен носителя, но я получаю KeyError
сообщение о том, что такого атрибута не существует.
Когда я печатаю response.headers
, я получаю MutableHeaders({'content-length': '14', 'content-type': 'application/json'})
.
Почему атрибут авторизации отсутствует в заголовке, несмотря на запрос с заголовком auth
?
@app.middleware("http")
async def validate_access_token(request: Request, call_next):
response = await call_next(request)
access_token = response.headers["Authorization"].split()
is_valid_signature = jwt.decode(access_token[1], key=SECRET, algorithms=CRYPT_ALGO)
if is_valid_signature:
return response
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='Invalid access token'
)
Да, я жестко запрограммировал это. Я добавил токен в заголовок «Авторизация» на Postman.
Но ваш код явно берет его из запроса и добавляет в ответ? Это не происходит автоматически, так как нет смысла возвращать токен на предъявителя конечному пользователю?
Да, когда пользователь входит в систему, я возвращаю JWT, и клиентское приложение будет использовать его в качестве токена аутентификации. Разве это не хороший подход?
О, я вижу, это была глупая ошибка, лол. Спасибо за предложение относительно зависимостей!
Вы пытаетесь получить заголовок Authorization
из объекта Respone
вместо объекта Request
(как вы упомянули в заголовке вашего вопроса). Следовательно, вы должны вместо этого использовать:
access_token = request.headers['Authorization']
^^^^^^^
или
access_token = request.headers.get('Authorization')
Кроме того, вместо промежуточного программного обеспечения может быть лучше использовать Зависимости вместе с FastAPI OAuth2PasswordBearer (вы можете найти реализацию здесь ), аналогично этому ответу (который демонстрирует, как достичь аутентификация с использованием стороннего пакета FastAPI_Login - посмотрите соответствующую реализацию здесь).
А откуда вы ожидали заголовок? Вы сами установили его жестко в своем запросе? Или вы ожидали, что он вернется из вашей конечной точки?