JWT refresh_token 包含啥?
Posted
技术标签:
【中文标题】JWT refresh_token 包含啥?【英文标题】:What goes into a JWT refresh_token?JWT refresh_token 包含什么? 【发布时间】:2017-01-24 04:48:39 【问题描述】:我根据我在网上找到的一些示例为我的 Asp.net Core REST 服务构建了一些 JWT 中间件。我知道响应看起来像:
"access_token":"...",
"expires_in":3600,
"refresh_token":"???",
"token_type": "Bearer",
我了解如何创建 access_token:
Claim[] claims = new Claim[]
new Claim(JwtRegisteredClaimNames.Sub, strUsername),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, dtNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64)
;
JwtSecurityToken jwtAccess = new JwtSecurityToken(_options.Issuer, _options.Audience, claims, dtNow.DateTime,
dtNow.DateTime.Add(_options.AccessTokenExpiration), _options.SigningCredentials);
问题是如何创建 refresh_token?我搜索了高低,找不到太多关于它的文档。基本上,所有参考资料都说“它是存储在数据库中的令牌,具有更长的 TTL,您可以从中创建新的 access_token”。
那么 refresh_token 是否与 access_token 完全相同,只是 TTL 更长,并且针对数据库验证了额外的步骤?
我见过的一些示例 JWT 响应似乎 refresh_token 要短得多。我的 access_token 是用 RSA515 的证书签名的,所以字符串有点长...
【问题讨论】:
现在我个人的刷新令牌只是具有更长 TTL 和更多信息的 JWT,可帮助我验证资源所有者。它可以是一个简单的 GUID,用于将用户映射到令牌,其中到期时间也与令牌一起存储在数据库中。 看看下面来自Auth0的文章,它支持链接auth0.com/docs/tokens/refresh_token @Nkosi,在那个链接中,refresh_token 真的很短。 @Nkosi,我认为 GUID 非常不安全。 这就是为什么我通常倾向于使用另一个 JWT 作为刷新令牌。这似乎是多余的。但我在 JWT 中存储了一个 Guid 作为标识符,检查数据库中的该标识符以及客户端的其他一些可识别信息。我会说这更像是一个偏好问题 【参考方案1】:现在,我个人的刷新令牌只是具有更长 TTL 和更多信息的 JWT,可帮助我验证资源所有者。
看看下面来自 Auth0 的文章,它支持链接
https://auth0.com/docs/tokens/refresh_token
它甚至可以是一个简单的 GUID,用于将用户/客户端映射到令牌,其中到期时间也与令牌一起存储在数据库中。
以下示例来自上面的链接,他们在该链接中使用了类似于 Guid 的刷新令牌。
因此,例如,假设有一个用户“test”,密码为“test” 和一个客户“testclient”的客户秘密“秘密”,一个可以 请求一个新的访问令牌/刷新令牌对,如下所示:
$ curl -X POST -H 'Authorization: Basic dGVzdGNsaWVudDpzZWNyZXQ=' -d 'grant_type=password&username=test&password=test' localhost:3000/oauth/token
"token_type":"bearer",
"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiVlx1MDAxNcKbwoNUwoonbFPCu8KhwrYiLCJpYXQiOjE0NDQyNjI1NDMsImV4cCI6MTQ0NDI2MjU2M30.MldruS1PvZaRZIJR4legQaauQ3_DYKxxP2rFnD37Ip4",
"expires_in":20,
"refresh_token":"fdb8fdbecf1d03ce5e6125c067733c0d51de209c"
一旦他们的令牌过期,他们就会调用并传递刷新令牌以获取新的访问令牌。
现在我们可以使用刷新令牌通过点击获取新的访问令牌 令牌端点像这样:
curl -X POST -H 'Authorization: Basic dGVzdGNsaWVudDpzZWNyZXQ=' -d 'refresh_token=fdb8fdbecf1d03ce5e6125c067733c0d51de209c&grant_type=refresh_token' localhost:3000/oauth/token
"token_type":"bearer",
"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiVlx1MDAxNcKbwoNUwoonbFPCu8KhwrYiLCJpYXQiOjE0NDQyNjI4NjYsImV4cCI6MTQ0NDI2Mjg4Nn0.Dww7TC-d0teDAgsmKHw7bhF2THNichsE6rVJq9xu_2s",
"expires_in":20,
"refresh_token":"7fd15938c823cf58e78019bea2af142f9449696a"
安全注意事项
刷新令牌是长期存在的。这意味着当客户从 一个服务器,这个令牌必须被安全地存储以防止它被 被潜在的攻击者使用,因此存储不安全 它们在浏览器中。如果刷新令牌被泄露,它可能被用于 获取新的访问令牌(并访问受保护的资源),直到它 被列入黑名单或过期(可能需要很长时间)。刷新 令牌必须颁发给单个经过身份验证的客户端以防止使用 其他方泄露的代币。还必须保留访问令牌 秘密,但由于其寿命较短,安全考虑较少 关键。
【讨论】:
我知道。这些示例是为了表明它不一定是 JWT 哦,我明白了,好的,抱歉 :-) 没问题。容易误解。我可能会措辞更好。以上是关于JWT refresh_token 包含啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何以及为啥使用 refresh_token 处理 jwt 令牌过期,还有另一种选择吗? [关闭]
jwt中为什么用refresh_token去刷新access_token,直接把access_token的有效期设置长一点不行吗?
更新 Azure IDP 配置,使刷新令牌采用 JWT 格式