如何测试我的令牌是不是使用 IdentityServer4 刷新?

Posted

技术标签:

【中文标题】如何测试我的令牌是不是使用 IdentityServer4 刷新?【英文标题】:How can I test if my token is refreshed with IdentityServer4?如何测试我的令牌是否使用 IdentityServer4 刷新? 【发布时间】:2020-03-27 03:20:29 【问题描述】:

我用 IdentityServer4 创建了一个令牌我复制了这个 example 我只是修改了这个

IdentityServer -> 配置

public static IEnumerable<Client> GetClients()


    return new List<Client>
    
        new Client
        
            ClientId = "client",
            AllowedGrantTypes = GrantTypes.ClientCredentials,
            ClientSecrets =
            
                new Secret("secret".Sha256())
            ,
            AllowedScopes =  "tbtsmth" ,
            AccessTokenLifetime = 10,
            IdentityTokenLifetime = 10 

        
    ;

我的令牌应该在 10 秒后过期,每 10 秒我有一个刷新令牌,但我不知道如何测试它。我做这样的事情:

var tokenHandler = new JwtSecurityTokenHandler();
var jwtSecurityToken = tokenHandler.ReadJwtToken(tokenResponse.AccessToken);

Thread.Sleep(10000);

if (jwtSecurityToken.ValidTo < DateTime.UtcNow)
    Console.WriteLine("expired");
else
    Console.WriteLine("not expired");

它返回我已过期我认为它应该返回我未过期,因为它将被刷新。

【问题讨论】:

您可能想要(至少)更改标题。现在看来您要问same question 两次。 【参考方案1】:

client credentials flow 中没有刷新令牌。来自documentation:

以下流程支持刷新令牌:授权 代码、混合和资源所有者密码凭证流。

没有用户参与,因此不需要刷新令牌。您只需请求一个新令牌。


那么什么时候可以使用刷新令牌?当在用户流中需要访问令牌时,例如当您有一个不使用 cookie 或需要访问 api 的客户端时。

Jwt 访问令牌的问题是令牌过期。过期后,需要用户交互来请求新的访问令牌。由于这不是良好的用户体验,因此客户端可以使用刷新令牌来请求新的访问令牌。

刷新令牌与 jwt 访问令牌不同。刷新令牌不必是 Jwt 令牌,它保留在服务器端,并且比访问令牌具有(远)更长的生命周期(过期),并且可以撤销。撤销刷新令牌意味着无法再使用刷新令牌。

将刷新令牌视为允许客户端请求新访问令牌的某种密钥。

刷新令牌永远不会自动,因此您必须在客户端中构建逻辑来刷新令牌。下面是an example,介绍如何为允许的流刷新令牌。

流程可能是这样的,来自我的answer here:

    用户登录,收到一个 JWT 访问令牌(5 分钟)和刷新令牌 1 代码(48 小时)。刷新令牌 1 保存在服务器上。 五分钟后:访问令牌过期 使用刷新令牌 1 请求新的访问令牌。 用户收到一个新的访问令牌(5 分钟)和刷新令牌 2 代码(48 小时)。令牌 1 从内存中移除,令牌 2 被添加到内存中。 这会持续几个小时。 用户两天没有使用应用程序 50 小时后:因为两个令牌都已过期,用户必须再次登录。重置流程。

【讨论】:

我可以解释一下我的项目,我创建了一个带有许可证系统的项目,每个模块都需要一个令牌才能工作。此令牌必须在 5 分钟内工作,并且需要刷新。 如果令牌可以工作,我们需要每 5 分钟检查一次,你认为我必须使用参考令牌吗? 再考虑一下,您的方法不适用于许可证,因为用户仍然是经过身份验证的。 IdentityServer 是关于验证用户的,而许可证是关于授权用户的。 Resource-based authorization 可能是您更好的解决方案。 所以你认为我必须使用它而不是 identityServer4 ? IdentityServer 是关于验证 users 和授权 clients 的。用户授权不是 IdentityServer 的一部分,如 commented here。我建议您阅读文章本身以获取更多信息。授权有多个级别,因此不仅仅是这个,还可能是这个。因此,请继续使用 IdentityServer 进行身份验证,并确定最适合 authorization 的方式。

以上是关于如何测试我的令牌是不是使用 IdentityServer4 刷新?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CSRF 令牌测试 Laravel / Sanctum 端点

在 useEffect 挂钩中使用 axios 取消令牌时如何修复失败的测试

如何使用 Supertest 对文件上传进行单元测试并发送令牌?

如何检查所选帐户是不是有我的自定义令牌?

如何在 DRF 测试中使用 JWT 令牌?

如何在单元测试SpringBoot中解析JWT令牌