使用 JWT 的 Rest 服务安全化

Rest Service securization using JWT

我正在尝试在我的 Web 服务上实施基于令牌的身份验证。 我遵循了本教程:Tutoriel

首先,当我从 Web 服务获取令牌并在此处对其进行测试时:Website to test JWT Token 我收到一条消息:签名无效

当我试图从我的网络服务(在我的应用程序和 ws 之间)识别我的令牌时,这个函数抛出一个异常:

Unable to read JSON value: XXXX (some data...)

这里是生成令牌的代码:

private String issueToken(String username) {
    SecretKey key = keyGenerator.generateKey();
    String jwtToken = Jwts.builder()
            .setSubject(username)
            .setIssuer(context.getAbsolutePath().toString())
            .setIssuedAt(new Date())
            .setExpiration(Date.from(LocalDateTime.now().plusMinutes(60L).toInstant(ZoneOffset.UTC)))
            .signWith(SignatureAlgorithm.HS512, key)
            .compact();
    return jwtToken;
}

这里是检查发送的令牌是否有效的代码:

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
    // Get the HTTP Authorization header from the request
    String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);

    // Extract the token from the HTTP Authorization header
    String token = "";

    if(authorizationHeader != null)
        token = authorizationHeader.substring("Bearer".length()).trim();

    try {
        // Validate the token
        SecretKey key = keyGenerator.generateKey();
        System.out.println(token);
        System.out.println(key);
        Jwts.parser().setSigningKey(key).parseClaimsJws(token);

    } catch (Exception e) {
        System.out.println(e.getMessage());
        requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
    }
}

提前致谢。

已解决,感谢@jps :

"so your line "Token comparison" 是过滤器的输出,对吧?!然后它缺少前 6 个字符,这解释了你得到的异常。这 6 个字符可能在 token = authorizationHeader.substring("Bearer".length()).trim(); 。我猜你没有在请求中添加单词 'Bearer' 现在,而不是删除 'Bearer'它删除令牌的前 6 个字符