FastAPI问题:无法从中间件的Request对象获取认证令牌
请求令牌验证的错误分析与修复
核心问题
你完全搞混了请求头和响应头的作用:
- 客户端发请求时携带的
Authorization(你说的auth头)存在request.headers里,这是服务器要读取的请求信息 response.headers是服务器准备返回给客户端的响应信息,默认根本不会包含请求里的令牌,所以你从这里读取肯定会触发KeyError
另外你的中间件逻辑顺序也错了:应该先验证请求里的令牌,再让请求继续往下处理,而不是等请求处理完返回响应了才去做验证。
修正后的代码
@app.middleware("http") async def validate_access_token(request: Request, call_next): # 从请求头获取Authorization令牌 auth_header = request.headers.get("Authorization") if not auth_header or not auth_header.startswith("Bearer "): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail='缺少或无效的Authorization请求头' ) access_token = auth_header.split()[1] try: # 验证令牌签名 jwt.decode(access_token, key=SECRET, algorithms=[CRYPT_ALGO]) except jwt.InvalidTokenError: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail='无效的访问令牌' ) # 令牌验证通过,继续处理请求 response = await call_next(request) return response
关键细节说明
- 验证逻辑必须放在
call_next(request)之前:这样能在处理业务请求前就拦截无效令牌,避免浪费服务器资源 - 用
request.headers.get()替代直接索引:既可以避免键不存在时的KeyError,还能提前校验令牌的格式是否符合Bearer规范 - 捕获
jwt.InvalidTokenError:JWT签名无效、令牌过期、格式错误等情况都会抛出这个异常,统一捕获处理更严谨
内容的提问来源于stack exchange,提问作者Jpark9061
相关产品推荐
相关产品推荐

