JWT refresh_token中的内容

本文关键字:token refresh JWT | 更新日期: 2023-09-27 18:07:08

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

JWT refresh_token中的内容

现在我个人的刷新令牌只是jwt,具有更长的TTL和更多的信息,可以帮助我验证资源所有者。

看看以下来自Auth0的文章及其支持链接

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

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

下面的例子来自上面的链接,他们使用了一个类似于Guid的刷新令牌。

因此,例如,假设有一个用户'test',密码'test'一个客户端'testclient'和一个客户端秘密'secret',我们可以请求新的访问令牌/刷新令牌对,如下所示:

$ 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"
}

安全考虑

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