当前位置: 首页 > 知识库问答 >
问题:

JWT的refresh_token是什么?

艾俊晖
2023-03-14

基于我在网上找到的一些示例,我为我的Asp.netCore 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 的证书签名的,所以字符串有点长......

共有1个答案

利思源
2023-03-14

现在,就我个人而言,我的刷新令牌只是具有更长TTL和更多信息的JWT,这些信息有助于我验证资源所有者。

看看 Auth0 的以下文章,它支持链接

https://auth0.com/docs/tokens/refresh_token

它甚至可以是一个简单的GUID,用于将用户/客户端映射到令牌,其中到期时间也与令牌一起存储在数据库中。

以下示例来自上面位于的链接,他们在其中使用看起来像 Guid 的内容作为刷新令牌。

因此,例如,假设有一个密码为“test”的用户“test”和一个客户端密码为“secret”的客户端“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"
}

安全注意事项

刷新令牌是长期存在的。这意味着当客户端从服务器获取令牌时,必须安全地存储此令牌以防止其被潜在攻击者使用,因此将它们存储在浏览器中是不安全的。如果刷新令牌泄露,它可用于获取新的访问令牌(并访问受保护的资源),直到它被列入黑名单或过期(可能需要很长时间)。刷新令牌必须颁发给单个经过身份验证的客户端,以防止其他方使用泄露的令牌。访问令牌也必须保密,但由于其寿命较短,安全注意事项不太重要。

 类似资料:
  • 我在php中有两个oauth2客户端的例子,一个工作,另一个不工作,它返回一个错误: ([错误]= 我的问题是,oauth2服务器应该何时返回带有client_id的访问令牌响应,以及应该何时返回带有refresh_token的响应? 我的工作要求是: 我的不工作请求是: 既然它只是和变化,那么它什么时候应该来一个,什么时候应该来另一个?

  • “refresh_token”元素在5.1节和第6节中定义: refresh-token = 1*VSCHAR

  • 我开始学习基于令牌的身份验证,并尝试学习如何在Laravel5中实现它。我遇到了两种非常流行的技术来实现这一点,但我感到困惑,因为我对这两种技术都是新手。 Medium的这篇文章说我应该使用LucadeGasperi/oauth2-server-laravel,从Github上的明星数量和引向它的引用数量来看,我确信它在社区中是一个非常受欢迎的包。这一个应该帮助我实现OAuth。 谁能给我指出每一

  • 我生成了一个JWT,其中有一些我很了解的声明,但是在头中有一个声明叫做< code>kid。有人知道是什么意思吗? 我使用auth0.com生成了令牌

  • 我试图理解为什么JWT认证是无状态的。在有状态认证中,会有一个会话id。这里有一张JWT的代币,上面有签名。所以身份验证服务器发布JWT令牌,但是我可以说后续请求中JWT令牌的验证是由endpoint服务器(应用服务器)而不是身份验证服务器来完成的吗?我相信这是可能的,因为JWT是用截止日期(还有一些其他信息)签名的,并且认证服务器的公共证书对所有endpoint服务器都是可用的。 因此,认证服务