2017-02-06 43 views
1

我這個C#代碼(與System.IdentityModel.Tokens.Jwt)從.NET創建令牌:驗證的NodeJS JWT令牌從.NET失敗

var keybytes = Convert.FromBase64String("MYCUSTOMCODELONGMOD4NEEDBEZE"); 
var signingCredentials = new SigningCredentials(

new InMemorySymmetricSecurityKey(keybytes), 
SecurityAlgorithms.HmacSha256Signature, 
SecurityAlgorithms.Sha256Digest); 
var nbf = DateTime.UtcNow.AddDays(-100); 
var exp = DateTime.UtcNow.AddDays(100); 
var payload = new JwtPayload(null, "", new List<Claim>(), nbf, exp); 
var user = new Dictionary<string, object>(); 
user.Add("userId", "1"); 

payload.Add("user", user); 
payload.Add("success", true); 
var jwtToken = new JwtSecurityToken(new JwtHeader(signingCredentials), payload); 
var jwtTokenHandler = new JwtSecurityTokenHandler(); 
var resultToken = jwtTokenHandler.WriteToken(jwtToken); 

我送resultToken以和的NodeJS驗證(使用jsonwebtoken庫)用以下代碼:

var jwt = require('jsonwebtoken'); 

var result = jwt.verify(
    resultToken, 
    new Buffer('MYCUSTOMCODELONGMOD4NEEDBEZE').toString('base64'), 
    { algorithms: ['HS256'] }, 
    function(err, decoded) { 
    if (err) { 
    console.log('decode token failed with error: '+ JSON.stringify(err)); 
    } 
    } 
); 

我得到了錯誤:無效簽名。該resultToken內容:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTQ4MTMxMTUsIm5iZiI6MTQ3NzUzMzExNSwidXNlciI6eyJ1c2VySWQiOiIxIn0sInN1Y2Nlc3MiOnRydWV9.4bjYyIUFMouz-ctFyxXkJ_QcJJQofCEFffUuazWFjGw 

我調試它jwt.io上面簽名(MYCUSTOMCODELONGMOD4NEEDBEZE)和祕密的Base64編碼的檢查,它的確定。

我已經嘗試了簽名,而不在C#代碼換款keybytes base64編碼:

var keybytes = Encoding.UTF8.GetBytes("MYCUSTOMCODELONGMOD4NEEDBEZE"); 

而且它成功的NodeJS驗證。所以我認爲在驗證base64編碼簽名時,問題來自我的nodejs代碼。驗證令牌或某些東西時,我是否錯過了一些選項?

+0

請檢查此[https://runkit.com/589803649a353c0015f87d57/589803649a353c0015f87d58/branches/master](https://runkit.com/589803649a353c0015f87d57/589803649a353c0015f87d58/branches/master)和它的工作的罰款。 – Thennarasan

回答

1

我不知道你做了什麼,但是這段代碼正在爲你處理上面提供的令牌。

var jwt = require('jwt-simple') 

var secret = new Buffer('MYCUSTOMCODELONGMOD4NEEDBEZE').toString('base64') 
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTQ4MTMxMTUsIm5iZiI6MTQ3NzUzMzExNSwidXNlciI6eyJ1c2VySWQiOiIxIn0sInN1Y2Nlc3MiOnRydWV9.4bjYyIUFMouz-ctFyxXkJ_QcJJQofCEFffUuazWFjGw' 

var decoded = jwt.decode(token, secret) 
console.log(decoded) 

輸出:

❯ node jwt.js 
{ exp: 1494813115, 
    nbf: 1477533115, 
    user: { userId: '1' }, 
    success: true }  

使用jsonwebtoken庫

// var jwt = require('jwt-simple') 

var jwt = require('jsonwebtoken'); 
var secret = Buffer.from('MYCUSTOMCODELONGMOD4NEEDBEZE', 'base64') 
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTQ4MTMxMTUsIm5iZiI6MTQ3NzUzMzExNSwidXNlciI6eyJ1c2VySWQiOiIxIn0sInN1Y2Nlc3MiOnRydWV9.4bjYyIUFMouz-ctFyxXkJ_QcJJQofCEFffUuazWFjGw' 

jwt.verify(token, secret, { algorithms: ['HS256'] }, function(err, decoded) { 
    if (err) { 
     console.log(err) 
    } else { 
     console.log(decoded)  
    } 
}) 

再次還在工作的罰款。

我能看到的唯一區別就是祕密。

+0

對不起,我在我的問題中不清楚圖書館。我使用jwt.io上列出的jsonwebtoken(https://github.com/auth0/node-jsonwebtoken)。我會像使用代碼片段一樣使用jwt-simple,但我仍然好奇我的代碼有什麼問題。 –

+0

@ khoa_chung_89已更新。 jsonwebtoken也適用於我。可能祕密是什麼錯誤。 –

+0

它現在正常工作:)感謝您的幫助。不知道爲什麼我不能以你的方式創建緩衝區(可能是由於我的nodejs版本)。我必須創建緩衝區並編碼base64:var secret = new Buffer(「MYCUSTOMCODELONGMOD4NEEDBEZE」,「base64」); –