1

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

4

1 回答 1

1

现在,我个人的刷新令牌只是具有更长 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"
}

安全注意事项

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

于 2016-09-16T03:59:09.540 回答