【发布时间】: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 作为标识符,检查数据库中的该标识符以及客户端的其他一些可识别信息。我会说这更像是一个偏好问题
标签: c# asp.net-core jwt refresh-token