Following Starlette documentation (FastAPI uses Starlette for middlewares), response.headers["Authorization"]
should allow me to get the bearer token, but I get a KeyError
saying no such attribute exists.
When I print response.headers
, I get MutableHeaders({'content-length': '14', 'content-type': 'application/json'})
.
Why is the authorization attribute not in the header despite of making a request with an auth
header?
@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'
)
CodePudding user response:
You are trying to retrieve the Authorization
header from the Respone
instead of the Request
object (as you mentioned in the title of your question). Hence, you should instead use:
access_token = request.headers['Authorization']
^^^^^^^
or
access_token = request.headers.get('Authorization')
Additionally, instead of a middleware, it might be better to use Dependencies, along with FastAPI's OAuth2PasswordBearer
(you can find the implementation here), similar to this answer (which demonstrates how to achieve authentication using the third-party package FastAPI_Login - have a look at the relevant implementation here).