验证Auth0 JWT会引发无效的算法

时间:2017-11-05 07:00:55

标签: node.js oauth jwt auth0

我创建了一个Auth0客户端,我正在登录并收到此令牌:

g++ -Wall -Wextra -g

我现在要做的是使用jsonwebtoken验证令牌。令牌使用 RS256 算法进行签名。

我将签名证书下载为gdb,我成功使用它来验证令牌,如下所示:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik1rVkdOa1l5T1VaQ1JqTkRSVE5EUmtNeU5rVkROMEUyUTBVMFJrVXdPVEZEUkVVNU5UQXpOZyJ9.eyJpc3MiOiJodHRwczovL3RvdGFsY29tbW56LmF1LmF1dGgwLmNvbS8iLCJzdWIiOiJnb29nbGUtb2F1dGgyfDEwMzI5NzA4OTYyMTk5NjUwMjY2MiIsImF1ZCI6ImxTWUtXMUZZdENkMWJLQmdXRWN0MWpCbmtDU3R2dW5SIiwiaWF0IjoxNTA5ODYyMTI1LCJleHAiOjE1MTAyMjIxMjV9.kjmckPxLJ4H9R11XiBBxSNZEvQFVEIgAY_jj2LBy4sEJozBB8ujGE7sq9vEIjMms-Lv2q9WzFQPrqcxyBcYC4Je4QojMgvqLDCodtpot0QUle8QfGmonc1vZYIZyX-wqyOXtRqhoZVEKTeLhm9Le2CV4_a3BwgjkE1LjcDx01GZfsnaId8mh10kGk-DBmr5aVc8MxglLCq5Uk8Zbl2vDc__UMDgx1eQPQg-zve4fUf8zHcxizypYTnF_v0dEAT00L2j5J41SFYdWvP6ReQ3vhVYew2o9iM6u1s75HE-xW8s4pzV4BZAQtgfgIeCd6aVGZs76bcnQXBLej1B7zaPBvA

我想做什么并且它无法使用秘密验证令牌(在Auth0客户端设置中称为客户端密钥并且是字符串)。

.pem

此代码始终抛出错误:

var cert = fs.readFileSync('certificate.pem');
jwt.verify(token, cert, {algorithm: 'RS256'}, (err, decoded) => {
  console.log(err)
  console.log(decoded)
});

我的问题是:如何使用密钥验证RS256令牌而不是使用证书文件? (我也尝试创建一个使用HS256算法的新客户端,但我得到了同样的错误。)

4 个答案:

答案 0 :(得分:4)

如果您只使用 密钥,那么使用RS256将无法正常工作,因为它基于私钥/公钥对。仅使用密钥通常表示H256。在我的回答中,我假设你所谓的MYSECRET只是certificate.pem的内容。

无论如何,我认为你的字符串必须包含

-----BEGIN RSA PRIVATE KEY-----

-----END RSA PRIVATE KEY-----

PUBLIC 而不是 PRIVATE

您可以在source中看到这一点。错误消息中提到的行包含:

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'

我之前没有使用RS256和JWT,但我已经将它与ssh一起使用了,而且我知道它对标题非常敏感。字符串必须是完全正确的格式。

答案 1 :(得分:1)

您是否尝试将算法设置为“HS256”?

根据https://auth0.com/docs/api-auth/tutorials/verify-access-token#verify-the-signature

的Auth0文档
function test($a,$b){

   if ($a === $b) {
        return 0;
    }
    return ($a > $b)? 1:-1;
}

$arrayOne = array(
    "one"=>"elementOne",
    "two"=>"elementTwo",
    "three"=>"elementThree"
);

$arrayTwo = array(
    "one"=>"elementOne",
    "two"=>"elementTwo",
    "three"=>"elementThree"
);

答案 2 :(得分:1)

您需要更改验证方法的第三个参数

{algorithm: 'RS256'} to ==>{algorithms: 'RS256'}

并确保为算法编写正确的名称,它会正常工作

答案 3 :(得分:0)

您需要将允许的algorithms指定为字符串数组,而不是algorithm字符串。

jwt.verify(token, MYSECRET, { algorithms: ['RS256'] });