总的来说,我对 FastAPI 和 OAuth2 还很陌生。我刚刚完成了教程“带有密码和承载的简单 OAuth2” https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/这基本上是有道理的,但有一步对我来说就像魔法一样……
访问令牌如何存储到客户端并随后传递到客户端的请求中?
我对流程的理解基本上是
- 用户使用他们的用户名和密码进行身份验证(这些内容被发布到
/token
终点)。
- 用户的凭据经过验证,并且
/token
端点返回访问令牌(johndoe
) 在一些 JSON 中。 (这是用户接收访问令牌的方式)
- ???
- 用户向专用端点发出后续请求,例如
GET /users/me
。用户的请求包含 headerAuthorization: Bearer johndoe
。 (我认为文档没有提到这一点,但这是我通过检查 Chrome 开发者工具中的请求收集到的信息)
- 然后使用授权令牌来查找在 (4) 中发出请求的用户
步骤(3)是我不明白的部分。访问令牌似乎如何存储在客户端上,然后作为标头传递到下一个请求中?
Demo
当您运行教程中的代码时,您将获得以下 swagger 文档。 (注意授权按钮。)
I click Authorize and enter my credentials. (username: johndoe
, password: secret
)
![enter image description here](https://i.stack.imgur.com/YVyxu.png)
现在我可以访问/users/me
端点。
注意标题如何Authorization: Bearer johndoe
自动包含在我的请求中。
最后的注释:
- 我检查了我的 cookie、会话存储和本地存储,全部都是空的
- 如果刷新页面或打开新选项卡,授权标头就会消失
我怀疑 Swagger 正在暗中做事,但我无法证实。
如果您需要令牌的持久性,您通常会使用 localStorage 或类似的,但在 SwaggerUI 的特定情况下,身份验证信息保存在库内部。
如果您启用了持久性 SwaggerUI将把访问令牌持久保存到 localStorage https://github.com/swagger-api/swagger-ui/blob/cc408812fc927e265da158bf68239530740ab4cc/src/core/plugins/auth/actions.js#L274:
export const persistAuthorizationIfNeeded = () => ( { authSelectors, getConfigs } ) => {
const configs = getConfigs()
if (configs.persistAuthorization)
{
const authorized = authSelectors.authorized()
localStorage.setItem("authorized", JSON.stringify(authorized.toJS()))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)