web-dev-qa-db-ja.com

Auth0JWTが無効なアルゴリズムをスローすることを確認する

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アルゴリズムを使用する新しいクライアントも作成しようとしましたが、同じエラーが発生します)。

8
Roco CTZ

only秘密鍵を使用している場合、秘密鍵と公開鍵のペアに基づいているため、RS256の使用は機能しません。通常、秘密鍵のみを使用すると、H256を示します。私の答えでは、あなたがMYSECRETと呼んでいるのはcertificate.pemの内容にすぎないと思います。

とにかく、私はあなたの文字列が含まれている必要があると思います

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

そして

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

または[〜#〜] public [〜#〜]の代わりに[〜#〜] private [〜# 〜]

これは ソース で確認できます。エラーメッセージに記載されている行には、次のものが含まれています。

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で使用したことがあり、ヘッダーを持つことに非常に敏感であることを知っています。文字列は正確に正しい形式である必要があります。

6
Mika Sundland

アルゴリズムを「HS256」に設定してみましたか?

https://auth0.com/docs/api-auth/tutorials/verify-access-token#verify-the-signature のAuth0ドキュメントによると

For HS256, the API's Signing Secret is used. You can find this information at your API's Settings. Note that the field is only displayed for APIs that use HS256.

For RS256, the tenant's JSON Web Key Set (JWKS) is used. Your tenant's JWKS is https://YOUR_AUTH0_DOMAIN/.well-known/jwks.json.
2
lecstor

許可された algorithms を、algorithm文字列ではなく、文字列の配列として指定する必要があります。

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