2017-02-22 597 views
1

我使用JWT簽名不匹配本地計算的簽名

JwtBuilder builder = Jwts.builder() 
        .setId(user.getEmail()) 
        .signWith(signatureAlgorithm, signingKey); 

創建一個令牌,然後

Jwts.parser().setSigningKey(secret).parse(token); 

進行身份驗證。當我在JUnit測試中運行它時,它工作正常。但是,當我通過REST調用將標記傳遞爲標頭時,身份驗證會因SignatureException而失敗。我已經驗證了HTTP調用兩端的令牌,並且令牌字符串是相同的。創建/驗證的代碼是靜態的,因此每個方面的祕密都是一樣的。任何線索

+0

加載難道您發佈令牌的例子和密鑰? – pedrofb

+0

static key = MacProvider.generateKey(); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte [] apiKeySecretBytes = secret.getEncoded(); Key signingKey = new SecretKeySpec(apiKeySecretBytes,signatureAlgorithm.getJcaName()); – stanlick

回答

2

static Key secret = MacProvider.generateKey();會產生你的服務器被重新加載一個新的隨機密鑰,每次因爲當類被加載

這意味着,如果你發出一個智威湯遜,它只是只要有效靜態變量初始化服務器不重新啓動。你得到了SignatureException是因爲簽名密鑰是不同

您需要的簽名密鑰存儲secret.getEncoded()第一代後,當你的模塊開始

+0

偉大的觀察。但是,我在服務器上有一個實用程序類,它是對此靜態密鑰的唯一引用。它使用這個單一的參考進行創建和認證操作。這就是爲什麼它很混亂。 – stanlick

+0

只需檢查是否存在其他隱藏問題:您是否可以在簽署和驗證之前打印關鍵內容? E.g'System.out.println(DatatypeConverter.printHexBinary(secret.getEncoded()))' – pedrofb

+0

@stanlick,您是否在簽名和驗證時檢查密碼是否相同? – pedrofb