2012-01-15 66 views
3

我試圖解析和驗證基於此示例node.js的一個JWT令牌(在.NET編寫):https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.cs在node.js中驗證一個JWT

這裏是我的節點JS的JavaScript驗證令牌:

var validateSignature = function(key, claims, envelope, signature) { 
    var hasher = crypto.createHash('sha256'); 
    hasher.update(key + "JWTSig"); 
    var key = hasher.digest('binary'); 
    var hmac = crypto.createHmac('sha256', key); 
    hmac.update(envelope + '.' + claims); 
    var out = hmac.digest('base64'); 
    console.log(out); 
    console.log(signature); 
    console.log(out === signature); 
} 

現在,非常奇怪的是 - 它幾乎可行。這裏有三個的console.log語句的輸出:

pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE= 
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE 
false 

看來可疑的,我認爲哈希值是除了兩個相同的+ -/_ =

有人發現我的錯誤?與我的base64編碼有關。

UPDATE

我打出了一些更多,似乎有什麼時髦與base64編碼怎麼回事。在節點JS下面的代碼:

console.log(signature); 
var b = new Buffer(signature, 'base64'); 
console.log(b.toString('base64')); 

產量:

pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE 
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F 

這似乎很奇怪,不是嗎?

+1

這可能是因爲節點的HMAC函數輸出網頁或網址的安全哈希和你的代碼的其餘部分是正確的。 – 2012-01-15 02:10:47

+0

就像那樣,我只是更新了 – ConfusedNoob 2012-01-15 03:46:13

回答

2

感謝蒂莫西米德評論和推動我朝着正確的方向。

節點的緩存類型生成標準的Base64用+,/和=

還有這裏提到一個網址安全base64編碼:http://en.wikipedia.org/wiki/Base64

它與+替換 - ,/用_和=是可選的。在QueryString(d'uh)上傳遞的令牌是一個URL安全版本。因此有所不同。

代碼固定通過簡單:

out = out.replace('+','-').replace('/','_').replace('=',''); 
+0

舊的帖子,但仍然。你的代碼不會取代所有的事件。 'out = out.replace(/ \ +/g,' - ')。replace(/ \ // g,'_')。replace(/ =/g,'');' 雖然:) – 2012-06-21 08:26:31

+0

替換(/ =/g,'')將替換所有等號字符,即使它們不在字符串的末尾 – 2013-10-01 00:21:32

1

我前一段時間寫了這個庫,我想你可以使用一些代碼。它應該在node.js和現代瀏覽器中運行。