如何修改fastapi_jwt_auth代码,将刷新令牌放入请求体刷新访问令牌?
修改方案
要实现通过请求体传递刷新令牌来刷新访问令牌,只需以下几步修改:
1. 定义请求体模型
先用Pydantic定义一个模型,用来接收请求体中的刷新令牌字段:
from pydantic import BaseModel class RefreshTokenRequest(BaseModel): refresh_token: str
2. 修改接口逻辑
调整原接口,接收请求体模型,并手动验证传入的刷新令牌:
@router.post('/refresh-token') def refresh(token_request: RefreshTokenRequest, authorize: AuthJWT = Depends()): try: # 手动验证传入的刷新令牌有效性,指定验证类型为refresh authorize.jwt_required("refresh", token=token_request.refresh_token) # 从传入的刷新令牌中解析用户subject current_user = authorize.get_jwt_subject(token=token_request.refresh_token) # 生成新的访问令牌 new_access_token = authorize.create_access_token(subject=current_user) return {"access_token": new_access_token} except (JWTDecodeError, InvalidTokenError) as e: rex = ErrorResponse(error=1000, message="无效的刷新令牌") raise HTTPException(status_code=401, detail=rex.dict()) except Exception as e: handleException(e)
关键修改点说明
- 新增
RefreshTokenRequest模型:FastAPI会自动解析JSON请求体,确保refresh_token字段存在且为字符串类型。 - 手动传入令牌验证:替换默认的
jwt_refresh_token_required()(默认从请求头取令牌),改用jwt_required("refresh", token=...)手动传入请求体中的令牌。 - 指定令牌类型:通过
"refresh"参数明确验证的是刷新令牌,避免和访问令牌混淆。 - 解析subject时指定令牌:确保从传入的刷新令牌中获取用户信息,而非默认的请求头令牌。
内容的提问来源于stack exchange,提问作者Abrew Abraham Alex
相关产品推荐
相关产品推荐

