我在为Spring Rest服务添加安全性时面临Signature异常。请帮忙。
io.jsonwebtoken.SignatureException:JWT签名与本地计算的签名不匹配。 JWT有效性不能被断言,也不应该被信任。 at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:354)
//制作令牌
String token = Jwts.builder()
.setSubject(((User) auth.getPrincipal()).getUsername())
.signWith(SignatureAlgorithm.HS512, SECRET.getBytes("UTF-8"))
.compact();
res.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
//解码令牌
String token = request.getHeader(HEADER_STRING);
if (token != null) {
// parse the token.
String jwt = token.replace(TOKEN_PREFIX, "");
try {
Claims claims = Jwts.parser()
.setSigningKey(SECRET.getBytes("UTF-8"))
.parseClaimsJws(jwt)
.getBody();
if (claims.getSubject() != null) {
return new UsernamePasswordAuthenticationToken(claims.getSubject(), null, getAuthorities());
}
}
当我同时打印时,我收到以下文字。一个是有额外的空间。仅当我使用Rest客户端访问服务时才会发生这种情况。测试类工作正常。
makeToken = eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJza3AifQ.XUEsUFF3qm6fOeCG8xDLuRWjyd4kOh4g01olU_BsRyfqyI66MRhqmK-mxrAWsD17Ylmj-fZRRZUTRqxCQixxXQ
decodeToken = eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJza3AifQ.XUEsUFF3qm6fOeCG8xDLuRWjyd4kOh4g01olU_BsRyfqyI66MRhqmK-mxrAWsD17Ylmj-fZRR ZUTRqxCQixxXQ
答案 0 :(得分:0)
已经晚了,但值得,如果有人在解码JWT令牌时遇到相同的问题。
图书馆GitHub链接:
实施:
implementation ('com.auth0.android:jwtdecode:1.2.0'){
exclude group: 'com.android.support', module: 'appcompat-v7'
}
代码:
// token: eyJ0eXAiOiJKV1QiLCJhbxxxxxxx9.eyJpZC*********************UEFUSUVOVCIsImV4cCI6MTU2NTY5MzU5MCwib3JpZ0lhdCI6MTU2NTA4ODc5MH0.ZhPpZSFZL6EY-Mwrw0F*********MYmbw
private void getExpDate(String token) {
JWT jwt = new JWT(token);
Log.e(TAG,"Claim - id:"+jwt.getClaim("id").asString()+" - username:"+jwt.getClaim("username").asString()+" - role:"+jwt.getClaim("role").asString()+" - exp:"+jwt.getClaim("exp").asString());
}
Logcat结果:
E/PatientLogin: Claim - id:cd5dbe61-xxxx-xxxx-xxxx-xxxxxx - username:xxxx@gmail.com - role:PATIENT - exp:1565693590
测试JWT令牌: 如果要检查JWT令牌,请使用下面的链接。
OR
这是另一种可能也对您有用的方法。这将有助于避免使用第三方库。
参考:Orignal post
decoded(token);
public static String decoded(String JWTEncoded) {
String[] split = JWTEncoded.split("\\.");
Log.e(TAG, "Header: " + getJson(split[0]));
Log.e(TAG, "Body: " + getJson(split[1]));
return getJson(split[1]);
}
private static String getJson(String strEncoded){
String str_dec = "";
try {
byte[] decodedBytes = Base64.decode(strEncoded, Base64.URL_SAFE);
str_dec = new String(decodedBytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return str_dec;
}