2015-12-21 26 views
0

如何使用Node.js驗證使用JJWT(https://github.com/jwtk/jjwt)在Java中創建的JWT?如果我們創建JWT像下面並打印出值:在Java中創建JWT,需要在Node中驗證?

byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("something"); 
Key key = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS512.getJcaName()); 

JwtBuilder builder = Jwts.builder() 
      .setSubject(subject) 
      .signWith(SignatureAlgorithm.HS512, key); 

System.put.println(builder.compact()); 

試圖解碼在Node.js的結果無效簽名錯誤的打印字符串:

var nJwt = require('jsonwebtoken'); 

var token = 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJKb2UifQ.dqJqRrJ1zDlNq79RAJqhbqme23Fq_Fh9M4MufE5AT8A7-c2yo3OgG71RMSsUxloceG0WaYwhz3WIprcdZsYY_Q', 
secretKey = 'something'; 

var verifiedJwt = nJwt.verify(token,secretKey); 

console.log(verifiedJwt); 

令牌值不正確在上面的示例中,僅作爲示例提供。

+0

如何驗證可怕的屏幕分辨率... – user3309234

+0

您的意思是要求'njwt'或'jsonwebtoken'? – robertjd

+0

另外,請提供由jjwt正在生產的實際標記 - 這將幫助我們進行調試:) – robertjd

回答

1

在使用JJWT時,你是base64解碼字符串something,但在使用nJwt時你沒有這樣做。

字符串的字節和Base64解碼相同字符串的字節是不同的字節數組。所以你的兩個代碼示例正在使用不同的密鑰。

編輯:

此外,對於什麼它的價值,以確保重點完整性保證,你應該確保使用HMAC-SHA算法,當你的關鍵是等於或小於散列函數輸出長度。

對於SHA-256,輸出長度爲256位,SHA-384爲384,SHA-512爲512.這意味着最小密鑰長度爲32字節(32字節),48字節和64字節,分別。不建議使用something作爲HMAC-SHA-512的密鑰(9字節)。

這就是爲什麼JJWT提供了方便密鑰生成器,以確保最佳的做法:

byte[] hmacSha512Key = MacProvider.generateKey().getEncoded(); 
byte[] hmacSha384Key = MacProvider.generateKey(SignatureAlgorithm.HS384).getEncoded(); 
byte[] hmacSha256Key = MacProvider.generateKey(SignatureAlgorithm.HS256).getEncoded(); 

HTH!