jwt解码时的签名异常

时间:2017-11-07 13:55:26

标签: jwt

我在为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

1 个答案:

答案 0 :(得分:0)

已经晚了,但值得,如果有人在解码JWT令牌时遇到相同的问题。

图书馆GitHub链接:

  

https://github.com/auth0/JWTDecode.Android

实施:

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令牌,请使用下面的链接。

  

https://jwt.io/

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;
}