首页 文章

JWT访问令牌与刷新令牌(创建)

提问于
浏览
3

我正在创建一个Asp.net核心REST服务 . 目前正在通过JWT承载令牌进行身份验证 .

现在,我的代码看起来像:

DateTimeOffset dtNow = DateTime.Now;

        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);

        var response = new
        {
            access_token = new JwtSecurityTokenHandler().WriteToken(jwtAccess),
            token_type = "Bearer",
            expires_in = (int)_options.AccessTokenExpiration.TotalSeconds,
            refresh_token = ""
        };

问题:

  • 现在,我的访问令牌1小时好,刷新令牌60天 . 这些合理的 Value 观是?

  • 没有看到很多关于如何创建refresh_token的文档......这是创建的,就像访问令牌一样,但只是有不同的超时?

  • 我的理解是我应该将刷新令牌存储在数据库中,如果用户发送刷新令牌请求,我需要验证令牌的签名并确保它在我的数据库中?

  • 当用户请求刷新令牌时,我应该返回相同的refresh_token,无论它是否过期,让用户担心获取一个新的?

  • 用户一次只能有一个刷新令牌,对吗?如果他们再做一次password_grant,我只是覆盖刷新令牌,好像他们正在获得一个全新的?

  • 最后一个问题是,我看到人们正在进行JWT认证,这就是为什么我必须每隔5分钟获得一个新令牌,所以这一切看起来都像洗,除非我遗漏了什么?

1 回答

  • 5
    • 这完全取决于您的应用程序的需求,但这听起来像是合理的数字 .

    • 它们的创建方式不同 . 访问令牌通常是包含JWT的令牌 . 刷新令牌是必须保存在提供程序上的引用令牌,并在传入新的访问令牌时进行备份 .

    • 刷新令牌没有要验证的签名 . 基本上,您将传递客户端ID和密码以及刷新令牌等信息,这将允许您获取新的访问令牌 . 就像长时间保存的用户名和密码一样,必要时可以列入黑名单 .

    • 不可以在每次请求新的访问令牌时更新刷新令牌,这将为您提供“滑动”刷新令牌 .

    • 他们可以为每个应用程序使用不同的令牌,但每个应用程序可以在执行新登录时覆盖以前的刷新令牌 .

    • 是的,用户必须在大约30分钟内获得新的访问令牌,但是当您的角色提供者与您的应用程序不同时,这也会有所帮助 . 这为API提供了一种查看角色的方法,而无需调用授权服务器 . 当您在令牌中存储信息时,请求保存的数量非常大,并且每30分钟只需要重新获取该信息,而不是针对每个API调用或回发向单独的服务器发送额外的HTTP请求 .

    希望其中一些有用 . 我说的是次要的经验,但有非常好的资源从Auth0解释这些东西,或者基本上来自IdentityServer3(现在4)的人

相关问题