2016-08-22 12 views
0

json Webトークンを使用してアプリケーションを開発しようとしています。私はjjwtを使うことに決めましたが、うまくいきません。次のスニペットがあります。JWT無効な署名

Jwts.parser() 
     .setSigningKey(secretKey) 
     .parseClaimsJws(token) 
     .getBody() 

常に例外をスローします。

私は、次のコード

String compactJws = Jwts.builder() 
      .setSubject("Joe") 
      .signWith(SignatureAlgorithm.HS256, "secret") 
      .compact(); 

でトークンを生成しようとしましたが、私はここにhttps://jwt.io/このトークンを貼り付けたとき、私はそれが無効であるとの情報を得ました。なにが問題ですか ?

+0

[ジャワJJWT署名がjwt.ioデバッガで失敗して生成]の可能な重複(http://stackoverflow.com/questions/38263680/generated-with-java-jjwt-signature-fails-at-jwt -io-debugger) – pedrofb

答えて

0

signWithメソッドでプレーンテキストキーを渡していますが、それは問題です。 JJWTソースコード1として

/** 
331  * Signs the constructed JWT using the specified algorithm with the specified key, producing a JWS. 
332  * 
333  * <p>This is a convenience method: the string argument is first BASE64-decoded to a byte array and this resulting 
334  * byte array is used to invoke {@link #signWith(SignatureAlgorithm, byte[])}.</p> 
335  * 
336  * @param alg     the JWS algorithm to use to digitally sign the JWT, thereby producing a JWS. 
337  * @param base64EncodedSecretKey the BASE64-encoded algorithm-specific signing key to use to digitally sign the 
338  *        JWT. 
339  * @return the builder for method chaining. 
340  */ 
341  JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey); 
342 

343  /** 
344  * Signs the constructed JWT using the specified algorithm with the specified key, producing a JWS. 
345  * 
346  * @param alg the JWS algorithm to use to digitally sign the JWT, thereby producing a JWS. 
347  * @param key the algorithm-specific signing key to use to digitally sign the JWT. 
348  * @return the builder for method chaining. 
349  */ 
350  JwtBuilder signWith(SignatureAlgorithm alg, Key key); 

キーを含むベース64文字列を渡す、またはKeyオブジェクトを宣言し、それを構築するための関連情報を渡します。そのような例のように :

byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("c2VjcmV0");//this has to be base-64 encoded, it reads 'secret' if we de-encoded it 
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); 

    //Let's set the JWT Claims 
JwtBuilder builder = Jwts.builder().setId(id) 
           .setIssuedAt(now) 
           .setSubject(subject) 
           .setIssuer(issuer) 
           .signWith(signatureAlgorithm, signingKey); 
0

私はあなたが* .setSigningKey(秘密鍵)*と間違って何かをやっていると思います。 JWTを使用してトークンを検証する方法を示す完全なコードです。

package com.brajesh.test; 
import java.security.Key; 
import java.util.Date; 
import java.util.UUID; 
import javax.crypto.spec.SecretKeySpec; 
import javax.xml.bind.DatatypeConverter; 
import io.jsonwebtoken.Claims; 
import io.jsonwebtoken.JwtBuilder; 
import io.jsonwebtoken.Jwts; 
import io.jsonwebtoken.SignatureAlgorithm; 

public class JwtTokenDemo { 

    private String secretKey; 

    public static void main(String[] args) { 
     JwtTokenDemo jwtTokenDemo = new JwtTokenDemo(); 
     String tokens = jwtTokenDemo.createJWT("123", "thriev.com", "[email protected]", 12999L); 
     System.out.println("tokens : "+tokens); 

     System.out.println("========AFTER============"); 
     jwtTokenDemo.parseJWT(tokens); 
    } 


    //Sample method to validate and read the JWT 
    private void parseJWT(String jwt) { 
    //This line will throw an exception if it is not a signed JWS (as expected) 
    Claims claims = Jwts.parser()   
     .setSigningKey(DatatypeConverter.parseBase64Binary(secretKey)) 
     .parseClaimsJws(jwt).getBody(); 
     System.out.println("ID: " + claims.getId()); 
     System.out.println("Subject: " + claims.getSubject()); 
     System.out.println("Issuer: " + claims.getIssuer()); 
     System.out.println("Expiration: " + claims.getExpiration()); 
    } 
/** 
* 
* @param id 
* @param issuer 
* @param subject 
* @param ttlMillis 
* @return 
*/ 
private String createJWT(String id, String issuer, String subject, long ttlMillis) { 

    //The JWT signature algorithm we will be using to sign the token 
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; 

    long nowMillis = System.currentTimeMillis(); 
    Date now = new Date(nowMillis); 
    String keys = UUID.randomUUID().toString(); 
    System.out.println(keys); 
    this.secretKey = keys; 

    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(keys); 
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); 


    JwtBuilder builder = Jwts.builder().setId(id) 
           .setIssuedAt(now) 
           .setSubject(subject) 
           .setIssuer(issuer) 
           .signWith(signatureAlgorithm, signingKey); 

    if (ttlMillis >= 0) { 
    long expMillis = nowMillis + ttlMillis; 
     Date exp = new Date(expMillis); 
     builder.setExpiration(exp); 
    } 
    return builder.compact(); 
} 
}