2017-02-06 10 views
1

を失敗しました:Nodejsは、.NETからJWTトークンを検証し、私は(System.IdentityModel.Tokens.Jwt付き)このC#コードで、.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); 

私はnodejsにresultTokenを送信し、(とそれを検証しますjsonwebtoken library):

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 

は、私が上記の署名(MYCUSTOMCODELONGMOD4NEEDBEZE)と秘密をbase64でjwt.io上のデバッグ、それをチェックしてエンコード持っている、それは大丈夫です。

私はC#コードでkeybytesをchagingによってbase64エンコードせずに署名を試みた:

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

そしてそれはnodejsで正常に検証しました。だから私は問題が私のnodejsコードからbase64エンコードされた署名を確認するときに来ると思います。私はいくつかのオプションがトークンやsomethingsを確認するときに逃したか?

+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.Iに記載されているjsonwebtoken(https://github.com/auth0/node-jsonwebtoken)を使用しています。あなたのスニペットのようにjwt-simpleを使用しますが、私のコードで何が問題なのか不思議です。 –

+0

@ khoa_chung_89が更新されました。 jsonwebtokenも私のために働く。おそらく秘密は何が間違っているのかです。 –

+0

それは今働く:)あなたの助けに感謝します。あなたがあなたの方法でバッファを作成できない理由はわかりません(私のnodejsバージョンのせいで)。私は、バッファを作成し、base64をエンコードする必要があります:var secret = new Buffer( "MYCUSTOMCODELONGMOD4NEEDBEZE"、 "base64"); –

関連する問題