我正在尝试在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());
}
}
谢谢。
答案 0 :(得分:0)
已解决,感谢@jps
“因此您的行“令牌比较”是过滤器的输出,对吗?!然后它缺少前6个字符,这说明了您所获得的称呼。这6个字符可能已在token = authorizationHeader.substring(“ Bearer “ .length())。trim();。我想您没有在请求中添加单词“ Bearer”,现在,它不是删除“ Bearer”,而是删除了令牌的前6个字符。