use*_*svm 5 node.js express jwt asp.net-core identityserver4
我在我的node/express应用程序的服务器端验证JWT时遇到问题.该令牌是在asp.net核心应用程序中的Identity Server中生成的.生成的令牌是RS256令牌类型,这意味着需要在Identity Server中创建时生成私钥和公钥.这对我意味着什么 -
在客户端(Angular),我在登录后的所有请求中传递了Bearer令牌.我需要以某种方式验证该令牌.使用RS256令牌类型的方法是确保公钥匹配.我正在使用
const jwt2 = require('jwt-simple');
对于我的JWT验证.
问题是秘密,这里是jwt-simple文档jwt-simple链接.如果我在解码中使第三个值为false,那么它可以工作,因为它忽略了所需的秘密/证书.
我收到这个错误 -
错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始行
我正在中间件中进行此验证,因此所有端点都会触及它.我看到了这个问题 - 类似的问题并运行了相同的命令.我仍然收到错误,因为令牌与证书没有任何关系,因为我从Identity Server项目中获取它.所以我需要从该项目中检索cert公钥.
我怎样才能在令牌中发送该证书或以某种方式检索该有效证书?希望这有一定道理.任何帮助,将不胜感激.
v1 - (使用自签名server.crt作为证书并获取此错误)
错误:签名验证失败
App.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();
})
Run Code Online (Sandbox Code Playgroud)
v2 - (使用随机文本作为证书并获得此错误)
错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始行
App.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();
})
Run Code Online (Sandbox Code Playgroud)
因此,我似乎需要一个具有正确签名的证书,该证书与令牌生成的签名相匹配.
JWT.io解析了令牌结构 -
头
{
"alg": "RS256",
"kid": "1231231231231231231",
"typ": "JWT",
"x5t": "si7bdXd6......HnxhO4Wi_s"
}
Run Code Online (Sandbox Code Playgroud)
我对x5t做了什么吗?道歉为长篇大论.谢谢.
小智 2
我挖了一下,这是我的调查:
从node-jsonwebtoken 文档来看,您的秘密必须是有效的私钥。
SecretOrPrivateKey 是一个字符串、缓冲区或对象,其中包含 HMAC 算法的秘密或 RSA 和 ECDSA 的 PEM 编码私钥。如果私钥带有密码短语,则可以使用对象 { key, passphrase } (基于加密文档),在这种情况下,请确保传递算法选项
另外,最好提供“RS256”作为函数中的第三个encode参数decode。
检查下面的示例代码:
应用程序.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);
Run Code Online (Sandbox Code Playgroud)
执行:
$ node app.js
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.SKLxSFErngKdXEYQOP5faOZXHe2N_2EG1KjesPWKaZVvV6m5vTA_n77Y0K4x3ngCFQhv_CCwnAaK8BeBChgs5JUW9nMqnpTl73GkJLTzICC1Kl2hiH9724JuDyweAwoUsMntxFWMDhERhBPehHi10LZbH2BINmO-xxuLkMeemL0
{ foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)
示例私钥:
-----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-----
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |