我遵循了下面的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行,我确实会收到授权错误。任何帮助都很感激,这对我来说都是全新的。
1条答案
按热度按时间6mzjoqzu1#
如果您使用的是示例中定义的标准OAUT2_SCHEMA,那么您只是检索令牌。
你不能拿它做任何事。您的工作是验证令牌是否有效以及用户是否有权访问资源。
在示例中,它通常用于
get_current_user
。当您不包括报头时它出错的原因是OAuth2PasswordBearer
的默认行为是至少需要存在Authorization
报头(即,它至少必须能够获得某种令牌)。FastAPI示例使用以下函数来解码和验证JWT:
您的代码实际上只是询问“是否存在令牌?”仅此而已。