经过身份验证和未经身份验证的验证路径

问题描述 投票:0回答:1

因此使用效果很好的 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})```

```py
@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})

似乎没什么作用

python web fastapi web-frameworks pyjwt
1个回答
0
投票

OAuth2PasswordBearer

 标头不存在时,
Authorization
将(默认情况下)生成 401 错误,因此您的依赖项代码永远不会真正运行(因此您无法返回
None
)。

要更改行为,您可以在创建

auto_error
实例时提供参数
OAuth2PasswordBearer

默认情况下,如果未提供 OAuth2 身份验证所需的 HTTP Auhtorization 标头,它将自动取消请求并向客户端发送错误。

如果

auto_error
设置为
False
,当 HTTP 授权标头不可用时,依赖结果将是
None
,而不是出错。

当您想要进行可选身份验证时,这非常有用。

当您想要以多种可选方式之一(例如,使用 OAuth2 或在 cookie 中)提供身份验证时,它也很有用。

然后,在尝试在身份验证函数中对其进行解码之前,请检查

token
是否为
None

但是,请注意,如果不存在令牌(只是没有用户信息),这也将使所有其他端点可用。解决方案是定义两个

get_current_user
函数,一个
get_current_user
和一个
get_optional_user
,这两个函数又可以依赖于两个不同配置的
OAuth2PasswordBearer
实例,或者您可以处理
None
的情况在您的
get_current_user
函数中添加令牌,如果您自己不存在令牌,则引发 401。

© www.soinside.com 2019 - 2024. All rights reserved.