使用 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 个字符
我正在尝试在我的 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 个字符