spring security中的模拟JWT解码器

vvppvyoh  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(433)

这是我的服务类方法中基于传递的auth令牌获取jwt令牌的代码。

NimbusJwtDecoder decoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(userTokenUrl);
        Jwt jwt = decoder.decode(authResponse.authenticationResult().idToken());
        Map<String, Object> claims = jwt.getClaims();
        if(!ACTIVE.equals(claims.get(CUSTOM_STATUS).toString())) {
            throw new IllegalArgumentException("User is not active");
        }

我想为这个服务类方法编写一个junit。我尝试了以下方法,但在尝试解码令牌id illegalargumentexception时出错:尝试解码jwt时出错:已签名jwt被拒绝:需要另一个算法,或未找到匹配的密钥

NimbusJwtDecoder decoder = mock(NimbusJwtDecoder.class);
    when(decoder.decode(ArgumentMatchers.anyString()))
            .thenReturn(Jwt.withTokenValue(getToken()).header("typ", "JWT").header("alg", "HS256").claim("custom:status", "active").build());
6ju8rftf

6ju8rftf1#

我不确定这是可行的解决方案,但这对我来说是可行的。我通过提取jwt解码器代码来重构代码。我创建了一个返回jwt对象的新方法。

public Jwt getJwt(InitiateAuthResponse authResponse) {
    NimbusJwtDecoder decoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(userTokenUrl);
    return decoder.decode(authResponse.authenticationResult().idToken());
}

我在我的测试课上模仿这个方法。

Map<String, Object> headers = new HashMap<>();
    headers.put(HttpHeaders.AUTHORIZATION, "Bearer token");
    headers.put("typ", "JWT");
    headers.put("alg", "none");

    Map<String, Object> claims = new HashMap<>();
    claims.put("custom:status", "active");

    Jwt jwt = new Jwt("fake-token", Instant.now(), Instant.now().plusSeconds(100), headers, claims);
    doReturn(jwt).when(spyService).getJwt(ArgumentMatchers.any());

相关问题