2016-08-07 46 views
2

Ich stehe vor einem Problem, dass, wenn ich ein Token signieren auch ich es analysieren und es keine Unterschrift Ausnahme wirft.JWT Token-Verifikation mit Java

Sie können sehen, der Schlüssel ist anders, immer noch gibt es mir die richtige Antwort.

public class JwtUtil { 

public String parseToken(String token) { 
    try { 
     Jws<Claims> jwt = Jwts.parser()     
       .setSigningKey("[email protected]")      
       .parseClaimsJws(token); 


     System.out.println(jwt.getBody().getSubject()); 
     return "Valid"; 

    } catch (SignatureException jwtException) { 
     jwtException.printStackTrace(); 
     return null; 
    } 
} 


public String generateToken() { 

    Claims claim = Jwts.claims(); 
    claim.put("GivenName", "Johnny"); 
    claim.put("Surname", "Rocket"); 
    claim.put("Email", "[email protected]");  

    return Jwts.builder().setHeaderParam("typ", "JWT").setClaims(claim) 
      .setIssuer("Online JWT Builder") 
      .setAudience("www.example.com").setSubject("[email protected]") 
      .signWith(SignatureAlgorithm.HS256, "[email protected]").compact(); 


} 

public static void main(String[] args) { 
    JwtUtil jwtUtil = new JwtUtil();   
    String token = jwtUtil.generateToken(); 
    System.out.println(token); 

    JwtUtil jwtUtil1 = new JwtUtil(); 
    jwtUtil1.parseToken(token); 
} 
} 
+0

geworfen werden Können Sie nach die Konsolenausgabe? Versuchen Sie auch, 'setHeaderParam (" typ "," JWT ")' 'zu entfernen und sehen Sie, ob es einen Unterschied macht. – qwertz

+0

Ausgang: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJHaXZlbk5hbWUiOiJKb2hubnkiLCJTdXJuYW1lIjoiUm9ja2V0IiwiRW1haWwiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiaXNzIjoiT25saW5lIEpXVCBCdWlsZGVyIiwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSJ9.6rMHAdhvNyfe0Mqc6dgZ96QqEKzp4iEU3dle7eSIHMo ich auch durch Entfernen des Header versucht habe, wurde aber gleiches Ergebnis – ashishl

Antwort

1

Wirklich[email protected]und[email protected]sind die gleichen Schlüssel

Es ist zu JwtBuilder.signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) fällig. geht davon aus, dass Sie einen Schlüssel in base64 bereitstellen und Ihre Schlüssel nicht base64 sind. Wenn die Methode von base64 zu byte[] dekodiert, stellt der von jjwt verwendete Java-Konverter eine Darstellung der Zeichenfolge bereit. [email protected] und [email protected] werden mit dem Byte-Array

https://stackoverflow.com/a/38269014/6371459

Sie sich mit Siehe codiert testen

System.out.println(
      javax.xml.bind.DatatypeConverter.printBase64Binary(
        javax.xml.bind.DatatypeConverter.parseBase64Binary("[email protected]"))); 
System.out.println(
      javax.xml.bind.DatatypeConverter.printBase64Binary(
        javax.xml.bind.DatatypeConverter.parseBase64Binary("[email protected]"))); 

Versuchen Sie, eine (mehr) verschiedene Schlüssel und der SignatureException wird

+0

Dank bekommen, habe ich die Lösung, die ich den Schlüssel mit meinem statischen Schlüssel erzeugen kann, wie der Secure random1 = new Secure („uwiueweuwiieuiuwiuiuewiiewiieuiew“. getBytes()); \t \t SecretKey key1 = MacProvider.generateKey (Signaturalgorithmus.HS512, random1); – ashishl