因此使用 FastAPI PyJWT,我正在努力完成这项工作
user_dep = Annotated[Dict,Depends(api.get_current_user)]
@app.get('/')
async def home(request: Request,user:user_dep=Optional[models.AuthorizedUser]):
print(user)
if user is not None:
return RedirectResponse(url='/dashboard/')
return templates.TemplateResponse('home.html',context={'request':request})
预期功能:如果用户已经登录,他们应该自动重定向到我想要的预期页面。
运行这段代码,当我点击
/
路径时,它返回 401 Unauthorized
错误,这不是我目前想要的。
async def get_current_user(token: Annotated[str,Depends(oauth2_bearer)]):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get('username')
user_id: int = payload.get('id')
rank: str = payload.get('rank')
division: str = payload.get('division')
if username is None or user_id is None:
return None
#raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate user")
return {'username': username, 'id': user_id, 'rank': rank, 'division':division}
except PyJWTError:
return None
#raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials")
我是否有可能遗漏了一些步骤或其他什么?
我已经尝试了一切,甚至删除了以下操作,但似乎没有任何效果:
@app.get('/')
async def home(request: Request,user:user_dep=None):
print(user)
if user is not None:
return RedirectResponse(url='/dashboard/')
return templates.TemplateResponse('home.html',context={'request':request})
@app.get('/')
async def home(request: Request):
user = await user_dep()
print(user)
if user is not None:
return RedirectResponse(url='/dashboard/')
return templates.TemplateResponse('home.html',context={'request':request})
OAuth2PasswordBearer
标头不存在时,
Authorization
将(默认情况下)生成 401 错误,因此您的依赖项代码永远不会真正运行(因此您无法返回 None
)。
要更改行为,您可以在创建
auto_error
实例时提供参数 OAuth2PasswordBearer
。
默认情况下,如果未提供 OAuth2 身份验证所需的 HTTP Auhtorization 标头,它将自动取消请求并向客户端发送错误。
如果
设置为auto_error
,当 HTTP 授权标头不可用时,依赖结果将是False
,而不是出错。None
当您想要可选的身份验证时,这非常有用。
当您想要以多种可选方式之一(例如,使用 OAuth2 或在 cookie 中)提供身份验证时,它也很有用。
然后,在尝试在身份验证函数中对其进行解码之前,请检查
token
是否为 None
。
但是,请注意,如果不存在令牌(只是没有用户信息),这也将使所有其他端点可用。解决方案是定义两个
get_current_user
函数,一个 get_current_user
和一个 get_optional_user
,这两个函数又可以依赖于两个不同配置的 OAuth2PasswordBearer
实例,或者您可以处理 None
的情况在您的 get_current_user
函数中添加令牌,如果您自己不存在令牌,则引发 401。