带有JWT令牌的FastApi OAuth2不起作用

yqhsw0fo  于 2022-10-08  发布在  其他
关注(0)|答案(1)|浏览(199)

我遵循了下面的FastApi安全指南:https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/

我只是做了一些更改,使其特定于我,比如更改用户名、密码和密钥。这似乎奏效了。当我将token: str = Depends(oauth2_scheme)添加到我的终端时,我看到它们被锁定,我需要登录才能访问它们。然而,我在我的前端做测试,从数据库中拉出一些数据,我发现我不需要将我的令牌传递给端点来访问它。我只需要通过request.setRequestHeader('Authorization', 'Bearer '),它就能工作。我对我错过了什么感到非常困惑。我的理解是,我还需要传递令牌才能访问端点。类似于:request.setRequestHeader('Authorization', 'Bearer ' + "TOKEN")

下面是一个示例端点和访问它的JS代码。

@app.get("/Tables")
async def  tables(token: str = Depends(oauth2_scheme)):
    x = ("SHOW TABLES;")
    db = db_conn(x)
    return db

function tablesFunction(){
    console.log('Loading Tables');
    // console.log("token", tokenObj);
    var request = new XMLHttpRequest()
    request.open('GET', 'http://127.0.0.1:8000/Tables', true) 
    request.setRequestHeader('Authorization', 'Bearer')
    request.onload = function () {
       Code that calls my db and displays the tables on the webpage
      }
      request.send()
}

正如您在上面的示例中看到的,我没有传递登录时的令牌。但这仍然是可行的。如果我删除setRequestHeader行,我确实会收到授权错误。任何帮助都很感激,这对我来说都是全新的。

6mzjoqzu

6mzjoqzu1#

如果您使用的是示例中定义的标准OAUT2_SCHEMA,那么您只是检索令牌

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

你不能拿它做任何事。您的工作是验证令牌是否有效以及用户是否有权访问资源

在示例中,它通常用于get_current_user。当您不包括报头时它出错的原因是OAuth2PasswordBearer的默认行为是至少需要存在Authorization报头(即,它至少必须能够获得某种令牌)。

FastAPI示例使用以下函数来解码和验证JWT:

async def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            raise credentials_exception
        token_data = TokenData(username=username)
    except JWTError:
        raise credentials_exception
    user = get_user(fake_users_db, username=token_data.username)
    if user is None:
        raise credentials_exception
    return user

您的代码实际上只是询问“是否存在令牌?”仅此而已。

相关问题