我已经创建了一个Auth0客户机,我将登录并接收以下令牌:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik1rVkdOa1l5T1VaQ1JqTkRSVE5EUmtNeU5rVkROMEUyUTBVMFJrVXdPVEZEUkVVNU5UQXpOZyJ9.eyJpc3MiOiJodHRwczovL3RvdGFsY29tbW56LmF1LmF1dGgwLmNvbS8iLCJzdWIiOiJnb29nbGUtb2F1dGgyfDEwMzI5NzA4OTYyMTk5NjUwMjY2MiIsImF1ZCI6ImxTWUtXMUZZdENkMWJLQmdXRWN0MWpCbmtDU3R2dW5SIiwiaWF0IjoxNTA5ODYyMTI1LCJleHAiOjE1MTAyMjIxMjV9.kjmckPxLJ4H9R11XiBBxSNZEvQFVEIgAY_jj2LBy4sEJozBB8ujGE7sq9vEIjMms-Lv2q9WzFQPrqcxyBcYC4Je4QojMgvqLDCodtpot0QUle8QfGmonc1vZYIZyX-wqyOXtRqhoZVEKTeLhm9Le2CV4_a3BwgjkE1LjcDx01GZfsnaId8mh10kGk-DBmr5aVc8MxglLCq5Uk8Zbl2vDc__UMDgx1eQPQg-zve4fUf8zHcxizypYTnF_v0dEAT00L2j5J41SFYdWvP6ReQ3vhVYew2o9iM6u1s75HE-xW8s4pzV4BZAQtgfgIeCd6aVGZs76bcnQXBLej1B7zaPBvA
我现在要做的是使用jsonwebtoken验证令牌。令牌由RS256算法签名。
我以.pem
的形式下载了签名证书,成功地使用它来验证令牌,如下所示:
var cert = fs.readFileSync('certificate.pem');
jwt.verify(token, cert, {algorithm: 'RS256'}, (err, decoded) => {
console.log(err)
console.log(decoded)
});
我想要做的(它不起作用)是使用这个秘密(在Auth0客户端设置中称为客户端秘密,它是一个字符串)验证令牌。
jwt.verify(token, MYSECRET, {algorithm: 'RS256'}, (err, decoded) => {
console.log(err)
console.log(decoded)
});
此代码总是引发错误:
{ JsonWebTokenError: invalid algorithm
at Object.module.exports [as verify] (C:\code\aws\learn-authorizer\node_modules\jsonwebtoken\verify.js:90:17)
at Object.<anonymous> (C:\code\aws\learn-authorizer\testme.js:25:5)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
at Function.Module.runMain (module.js:665:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3 name: 'JsonWebTokenError', message: 'invalid algorithm' }
我的问题是:如何使用秘密密钥来验证RS256令牌,而不是使用证书文件?(我还尝试创建一个使用HS256算法的新客户端,但我得到了相同的错误)。
发布于 2017-11-05 11:51:22
如果您只使用一个秘密密钥,那么使用RS256将无法工作,因为它是基于私钥/公钥对的。仅使用秘密密钥通常表示H256。在我的回答中,我假设您所称的MYSECRET
只是certificate.pem
的内容。
不管怎样,我认为你的字符串必须包含
-----BEGIN RSA PRIVATE KEY-----
和
-----END RSA PRIVATE KEY-----
或者是公共的而不是私人的。
您可以在来源中看到这一点。错误消息中提到的行包含:
if (!~options.algorithms.indexOf(header.alg)) {
return done(new JsonWebTokenError('invalid algorithm'));
}
options.algorithms
被定义为
if (!options.algorithms) {
options.algorithms = ~secretOrPublicKey.toString().indexOf('BEGIN CERTIFICATE') ||
~secretOrPublicKey.toString().indexOf('BEGIN PUBLIC KEY') ?
[ 'RS256','RS384','RS512','ES256','ES384','ES512' ] :
~secretOrPublicKey.toString().indexOf('BEGIN RSA PUBLIC KEY') ?
[ 'RS256','RS384','RS512' ] :
[ 'HS256','HS384','HS512' ];
}
如果在开始和结束时没有RSA,它将查找以下算法:'HS256','HS384','HS512'
。
我以前没有在JWT中使用过RS256,但是我在ssh中使用过它,并且我知道它对拥有标题非常敏感。字符串必须采用完全正确的格式。
发布于 2019-04-29 23:51:14
您需要将允许的algorithms
指定为字符串数组,而不是algorithm
字符串。
jwt.verify(token, MYSECRET, { algorithms: ['RS256'] });
发布于 2021-01-07 13:43:04
您需要更改验证方法的第三个参数,即
{algorithm: 'RS256'} to ==>{algorithms: 'RS256'}
并确保您为该算法编写了正确的名称,它将运行良好。
https://stackoverflow.com/questions/47119043
复制相似问题