web-dev-qa-db-ja.com

jsonwebtokenを使用すると、Firebaseカスタムトークンを確認してトークンIDを取得できません

バックエンドでは、次のようにカスタムトークンがfirebaseの管理SDKを介して生成されます。

_router.use('/get-token', (req, res) => {
    var uid = "big-secret";
    admin.auth().createCustomToken(uid)
      .then(function(customToken) {
        res.json({
          instanceID: customToken
        });
      })
      .catch(function(error) {
        console.log("Error creating custom token:", error);
    });
});
_

次に、クライアントフロントエンドアプリがcustomTokenを取得し、それを使用してバックエンドにリクエストを返し、次のことを確認します。

_const fbPrivateKey = serviceAccount.private_key;
const key = new NodeRSA(fbPrivateKey).exportKey('pkcs8-public-pem');
router.get('/verifyIdToken', cors(), (req, res) => {
  jwt.verify(req.headers.authorization.split('Bearer ')[1], key, { algorithms: ['RS256'] }, function(err, decoded) {
    console.log('err', err);
    console.log('decoded', decoded);
  });
_

これは常にメッセージでエラーになります:_JsonWebTokenError: invalid signature_

これには署名が必要ですか?誰かがこれを説明できるか、何か指針があれば?

UPDATE:req.headers.authorization.split('Bearer ')[1]から jwt.io を実行すると、署名が無効であると表示されますが、秘密鍵(key)を入力すると、検証されます。

メソッド呼び出しが正しくないか、間違った引数をjwt.verify()に渡していますか?

13
Harry Lincoln

カスタムトークンを使用してverifyIdTokenを呼び出しているようです。それはうまくいきません。 verifyIdTokenは「IDトークン」のみを受け入れます。カスタムトークンからIDトークンを取得するには、最初に signInWithCustomToken() を呼び出します。次に、サインインしたユーザーインスタンスで getToken() を呼び出します。

13

SignInWithCustomToken()を使用したくない場合は、これが正しい方法です。

const publicKey = new NodeRSA().importKey(serviceAccount.private_key, "pkcs8-private-pem").exportKey("pkcs8-public-pem")

jwt.verify(token, publicKey, {
        algorithms: ["RS256"]
    }, (err, decoded) => {
        if (err) {
            # send some error response
            res.status(400).json({
                status: 0,
                message: "Token is invalid!"
            })
        } else {
            # send some valid response
            res.status(200).json({
                status: 1,
                message: "Token is valid for uid " + decoded.uid
            })
        }
    })
0
Flavio Rajta