【问题标题】:Nodejs verify jwt token from .net failedNodejs从.net验证jwt令牌失败
【发布时间】:2017-06-22 21:55:00
【问题描述】:

我通过这个 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);

我将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 编码,没关系。

我尝试了一个没有 base64 编码的签名,通过 C# 代码中的keybytes 编码:

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

并且在 nodejs 中验证成功。所以我认为问题出在我的 nodejs 代码验证 base64 编码签名时。我在验证令牌或其他东西时错过了一些选项吗?

【问题讨论】:

标签: c# node.js jwt


【解决方案1】:

我不知道你做了什么,但这个 sn-p 使用你上面提供的令牌为我工作。

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)    
    }  
})

仍然可以正常工作。

我能看到的唯一区别就是秘密。

【讨论】:

  • 抱歉,我对我的问题中的库不清楚。我正在使用 jwt.io 上列出的 jsonwebtoken (github.com/auth0/node-jsonwebtoken)。我会像你的 sn-p 一样使用 jwt-simple,但我仍然很好奇我的代码有什么问题。
  • @khoa_chung_89 已更新。 jsonwebtoken 也适用于我。可能秘密就是出了什么问题。
  • 现在可以使用了 :) 感谢您的帮助。不知道为什么我不能以你的方式创建缓冲区(这可能是由于我的 nodejs 版本)。我必须创建缓冲区并编码 base64: var secret = new Buffer("MYCUSTOMCODELONGMOD4NEEDBEZE", "base64");
  • @khoa_chung_89 我正在使用节点 7。可能 API 发生了变化。
猜你喜欢
  • 2016-01-17
  • 2019-06-14
  • 2022-09-25
  • 2017-05-14
  • 2021-06-27
  • 2021-12-10
  • 2021-09-10
  • 2021-12-08
  • 2019-06-23
相关资源
最近更新 更多