检索 JWT 身份验证的证书/机密时出现问题.(Node/Express/C#/IdentityServer)



我在节点/快速应用程序的服务器端验证 JWT 时遇到问题。令牌是在身份服务器 asp.net 核心应用中生成的。生成的令牌是 RS256 令牌类型,这意味着在身份服务器中创建时需要生成私钥和公钥。这对我意味着什么——

在客户端(Angular)上,登录后,我将在所有请求上传递持有者令牌。我需要以某种方式对该令牌进行身份验证。使用 RS256 令牌类型执行此操作的方法是确保公钥匹配。我正在使用

const jwt2 = require('jwt-simple');

对于我的 JWT 验证。

问题是秘密,这里是 jwt-simple 文档 jwt-simple 链接。如果我在解码 false 中生成第三个值,它可以工作,因为它忽略了所需的机密/证书。

我收到此错误 -

错误:

错误:0906D06C:PEM 例程:PEM_read_bio:无启动行

我在中间件中进行此验证,以便所有端点都会命中它。 我看到了这个问题 - 如此类似的问题并运行了相同的命令。我仍然收到错误,因为令牌与证书没有任何关系,因为我是从身份服务器项目中获取的。所以我需要从该项目中检索证书公钥。

我如何在令牌中发送该证书或以某种方式检索该有效证书?希望这是有道理的。任何帮助将不胜感激。

v1 -(使用自签名服务器.crt 作为证书并收到此错误)

错误:签名验证失败

应用.js

//This is for a self-signed certificate locally with no correlation to the token itself.
const options = {
key: fs.readFileSync('./key.pem', 'utf8'),
cert: fs.readFileSync('./server.crt', 'utf8')
};
app.use((req, res, next) => {
if(!req.headers.authorization){
return res.status(403).json({ error: 'No credentials sent!'});
} else {
let token = req.headers.authorization.split(' ')[1]
var decoded = jwt.decode(token, options.cert);
if(decoded){
let currentTime = new Date().getTime()/1000
if(decoded.exp <= currentTime){
return res.status(403).json({
error: 'Token has expired'
}); 
}
}
else if(!decoded){
return res.status(403).json({
error: 'invalid token'
}); 
}
}
next();
})

v2 - (使用随机文本作为证书并收到此错误)

错误:

错误:0906D06C:PEM 例程:PEM_read_bio:无启动行

应用.js

app.use((req, res, next) => {
if(!req.headers.authorization){
return res.status(403).json({ error: 'No credentials sent!'});
} else {
let token = req.headers.authorization.split(' ')[1]
var secret = new Buffer('newsecret').toString('base64')
var decoded = jwt2.decode(token, secret);
if(decoded){
let currentTime = new Date().getTime()/1000
if(decoded.exp <= currentTime){
return res.status(403).json({
error: 'Token has expired'
}); 
}
}
else if(!decoded){
return res.status(403).json({
error: 'invalid token'
}); 
}
}
next();
})

因此,我似乎需要一个具有正确签名的证书,该证书与令牌生成的签名相匹配。

JWT.io 解析的令牌结构 -

页眉

{
"alg": "RS256",
"kid": "1231231231231231231",
"typ": "JWT",
"x5t": "si7bdXd6......HnxhO4Wi_s"
}

我用x5t做什么吗?对长篇文章表示歉意。谢谢。

我挖了一点,这是我的调查:

从node-jsonwebtoken文档中,您的密钥必须是有效的私钥。

secretOrPrivateKey 是一个字符串、缓冲区或对象,包含 HMAC 算法的密钥或 RSA 的 PEM 编码私钥 和幼儿发展。如果私钥带有密码,则对象 { 键, 在这种情况下,可以使用密码短语 }(基于加密文档) 确保传递算法选项

此外,最好提供"RS256">作为encodedecode功能的第三个参数。

查看以下示例代码:

应用.js

var jwt = require('jwt-simple');
var fs = require('fs')
var payload = { foo: 'bar' };
var secret = fs.readFileSync(__dirname + '/private.key');
var token = jwt.encode(payload, secret, 'RS256');
console.log(token);
var decoded = jwt.decode(token, secret, 'RS256');
console.log(decoded);

执行:

$ node app.js
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.SKLxSFErngKdXEYQOP5faOZXHe2N_2EG1KjesPWKaZVvV6m5vTA_n77Y0K4x3ngCFQhv_CCwnAaK8BeBChgs5JUW9nMqnpTl73GkJLTzICC1Kl2hiH9724JuDyweAwoUsMntxFWMDhERhBPehHi10LZbH2BINmO-xxuLkMeemL0
{ foo: 'bar' }

示例私钥:

-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCGMBPo1UPwep2kHj1auLvyi6tJwwf/BS6rv3dDlwyXcQq4fLY4 ldNc+FOpYOKQF33ZltmNkmi2IQukNKZtzJtFyMRNARXIcttTARGL6NIfsYU80kmB RCXjTc3rt088fmxij9HiXFQSpraKrt86ZQXnnkJyEGsQNuftm7yF7A3MOwIDAQAB AoGAGGuxg+MkHSTDgbW7JsKN+eMvRhpHX0L7LmiG9PcNZJY/BDo2E3A46ieLWjz2 npCX57yLVTd69QJokva9/yeIblQpOIXw1U5PlID5mgjTTxJNzLPbXxjuWixZXKJ3 VHZXIAktbM36jdBj5gpxPmWgHa1+572pkx60QIXppKm+8AkCQQDHhQLpP3Z1Mq28 tnoL1NE9Ytxs0DHBkvWEFIbbPhhLPVMWLpCKuh92fNuTQrajMZtQOabaqz/ARI4u Ty8uyM0lAkEArCyJaH2rRxFZuT7zrQKhuG9pDb/SDAplDEA1iREZmpWV4ClBN+7+ kMEypx7jz5kdlhN/y4oCS/BAaJgaoc3l3wJBAJBTMDLnfFn0yeZ7nTdXv/AGxmpU A9oB42Wir5aCiXJLrwGZt2cSkdXVJcSVeqX8KVxUB9WgEOKU9MCc+QV/rZ0CQBzE XDkPNjzrkzg2YnR3yhmM09quQCQu4G9JkyhRqRuA/sezXOhBkFsTTKlLqfiXtq/K lkGlz3hsrfZL47dBNbUCQQDHUPfaAXQdbAns9O6s0wwXncaKo1r4QU4ZOQOc3mM0 e15fW/Ya22J2z9DUx8lNwMnoGzqBcVEPdHnFqbUJPZsw -----END RSA PRIVATE KEY-----

最新更新