简体   繁体   English

Node.js验证来自.net的jwt令牌失败

[英]Nodejs verify jwt token from .net failed

I create token from .net by this C# code (with System.IdentityModel.Tokens.Jwt): 我通过此C#代码(使用System.IdentityModel.Tokens.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);

I send the resultToken to nodejs and verify it (with jsonwebtoken library) with below code: 我将resultToken发送到nodejs并使用以下代码resultToken进行验证(使用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));
    }
  }
);

I got the error: invalid signature. 我收到错误:签名无效。 The resultToken content: resultToken内容:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTQ4MTMxMTUsIm5iZiI6MTQ3NzUzMzExNSwidXNlciI6eyJ1c2VySWQiOiIxIn0sInN1Y2Nlc3MiOnRydWV9.4bjYyIUFMouz-ctFyxXkJ_QcJJQofCEFffUuazWFjGw

I have debug it on jwt.io with above signature ( MYCUSTOMCODELONGMOD4NEEDBEZE ) and secret base64 encoded checked, it's ok. 我已经在jwt.io上使用上述签名( MYCUSTOMCODELONGMOD4NEEDBEZE )对其进行了调试,并检查了秘密base64编码,这没关系。

I have tried a signature without base64 encoded by chaging keybytes in C# code: 我已经尝试通过在C#代码中keybytes对没有base64的签名进行编码:

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

And it verified successfully in nodejs. 并在nodejs中成功验证。 So i think the issue comes from my nodejs code when verify a base64 encoded signature. 所以我认为问题出在验证base64编码签名时来自我的nodejs代码。 Did i miss some options when verify token or somethings? 验证令牌或其他内容时,我是否错过了某些选择?

I have no idea what you did but this snippet is working for me with the token you provided above. 我不知道您做了什么,但是此代码段对我有用,上面提供了您提供的令牌。

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)

Output: 输出:

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

Using jsonwebtoken library 使用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)    
    }  
})

Again still working fine. 再次仍然可以正常工作。

The only difference i can see is the secret. 我能看到的唯一区别是秘密。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM