Bearer Token 认证和 JWT

Posted

技术标签:

【中文标题】Bearer Token 认证和 JWT【英文标题】:Bearer Token authentication and JWT 【发布时间】:2021-08-02 09:04:18 【问题描述】:

我已经获得了一个 REST API,它具有身份验证类型承载(安全方案类型:API 密钥,标头参数名称:授权),我用它来验证用户,然后获取其他数据(我只会创建前端使用 react)。

作为第一步,用户登录,我将他/她的用户名密码发送到前面提到的 REST API 并取回访问权限和刷新令牌。

将这 2 个令牌存储在 cookie 中以便在后续请求中使用它们有什么问题吗? JWT 如何在这两个令牌中发挥作用?在这种情况下,JWT 对我有用吗?

【问题讨论】:

提供给您的 REST API 是第三方 api 吗?您是否可以控制 REST API,例如更改其函数处理程序? 我无法控制 REST API。 你在第一段中提到的REST API和你在第二段中提到的api是一样的吗?我对您的问题感到困惑,因为有身份提供者为开发人员提供 REST API 访问权限,以便为客户端获取访问权限和刷新令牌,例如在第三方登录的情况下。 是的,它们是一样的 【参考方案1】:

将令牌存储在 cookie 中没有任何问题,但如果您计划使用 React 构建单页应用程序,那么将这些令牌存储在内存中就足够了。用户刷新页面后,您可以让他们再次登录或在后台执行静默登录以获取一组新令牌。在这两种情况下,授权服务器上的会话都应该启动,并且您应该无需用户交互即可获得新令牌。

如果您不将它们保存在 cookie 中,您的令牌会更加安全。

JWT 不是访问和刷新令牌的要求。如果您不必使用它们,我建议您使用不透明的令牌。也就是说,由于您无法控制 API,您可能会受限于 API 所需的格式。如果您不想受到这种格式的限制,您可以设置自己的网关,您可以使用它来执行令牌交换或自省,并将请求转发到带有适当令牌的 API(称为 Phantom Token pattern。

【讨论】:

“将这些令牌存储在内存中就足够了”你说内存是什么意思?关于 React 应用程序,据我了解,存储令牌的可能位置是 cookie、本地存储、存储。你说的记忆是在商店里吗? react 中的 redux 存储是内存存储的一个示例。你可以选择不使用 redux store。在内存中存储只是意味着令牌存储在 javascript 变量中,并且只要 javascript 变量仍在内存中,它就存在。当您刷新页面时,内存中的令牌将被删除,您必须在后台再次获取它以再次将令牌存储到变量中,或者要求用户再次登录。 @kayuapi_my 准确地解释了我在这里的意思:)【参考方案2】:

根据我对问题的理解,您使用的是身份提供者,它为您提供访问令牌和用户刷新令牌。这意味着它是一种身份验证即服务 REST API。

REST API 需要一个授权标头与用户名密码一起传递,以便为用户交换访问令牌和刷新令牌。 (如果我错了,请纠正我)在这种情况下,您可能希望将授权标头远离用户(请参阅身份验证作为服务文档)。

您使用有效负载(用户密码)以及如下标头调用 REST API:

Authorization: ACCESS_TOKEN

但是,ACCESS_TOKEN 是供应商提供的,供您使用 REST API。在成功调用 REST API 时,它应该返回一组访问令牌和刷新令牌。然后,您可以使用此访问令牌和刷新令牌来保护您自己的 API,由您控制的 API 为您的用户提供服务。

访问令牌和刷新令牌可能只是 JWT 令牌(再次查阅供应商文档)。

此外,如果您使用身份验证即服务 REST API,请检查文档是否提供客户端 sdk。在这种情况下,它应该向您展示处理访问令牌和刷新它返回的令牌的最佳实践。

【讨论】:

以上是关于Bearer Token 认证和 JWT的主要内容,如果未能解决你的问题,请参考以下文章

Open ID Connect with JWT Bearer Token Grant Type

接口认证方式:Bearer Token

jwt

GoWeb开发基于CookieSession和基于JWT Token的认证模式介绍

理解JWT(JSON Web Token)认证及实践

0019 基于DRF框架开发(JWT token认证)