使用JWT的Rest Service证券化

时间:2018-06-28 22:38:58

标签: jax-rs jwt

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

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

当我尝试从Web服务(在应用程序和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());
    }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

已解决,感谢@jps

“因此您的行“令牌比较”是过滤器的输出,对吗?!然后它缺少前6个字符,这说明了您所获得的称呼。这6个字符可能已在token = authorizationHeader.substring(“ Bearer “ .length())。trim();。我想您没有在请求中添加单词“ Bearer”,现在,它不是删除“ Bearer”,而是删除了令牌的前6个字符。