【问题标题】:fastapi - optional OAuth2 authenticationfastapi - 可选的 OAuth2 身份验证
【发布时间】:2021-02-18 05:14:01
【问题描述】:

我需要创建一个 API,其路由能够识别当前用户是否是请求中指定的用户(也没有任何身份验证应该是有效的)

对于我遵循https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/ 的其他路径,一切都与带有 JWT 令牌的 Bearer 一起工作

user: User = Depends(get_current_active_user)

修改我尝试使用的文档提供的方法

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="auth")

async def get_user_or_none(db: Session = Depends(get_db), token: str = Depends(oauth2_scheme)):
    """
    Return the current active user if is present (using the token Bearer) or None
    """
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            return None
    except JWTError:
        return None
    
    # check user in db
    user = crud.get_user(db, username)
    if user is None:
        return None
    return user

@router.get("/api/{user_id}/structure")
async def get_user_structure(
    user_id: int,
    user = Depends(get_user_or_none),
    db: Session = Depends(get_db)
):
    # do_something() if user.id == user_id else do_something_else()

但我收到一个错误

401 Error: Unauthorized {
    "detail": "Not authenticated"
}

【问题讨论】:

    标签: python fastapi


    【解决方案1】:

    您需要为这些可选的经过身份验证的端点使用不同的OAuth2PasswordBearerauto_error=False,例如

    optional_oauth2_scheme = OAuth2PasswordBearer(tokenUrl="auth", auto_error=False)
    
    async def get_user_or_none(db: Session = Depends(get_db), token: str = Depends(optional_oauth2_scheme)):
        ...
    

    现在,当未提供 Authorization 标头时,令牌将为 None,从而产生您想要的行为。

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2016-04-27
      • 2015-07-12
      • 1970-01-01
      • 2021-06-24
      相关资源
      最近更新 更多