【发布时间】: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 编码签名时。我在验证令牌或其他东西时错过了一些选项吗?
【问题讨论】: