バックエンドでは、次のようにカスタムトークンが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()
に渡していますか?
カスタムトークンを使用してverifyIdToken
を呼び出しているようです。それはうまくいきません。 verifyIdToken
は「IDトークン」のみを受け入れます。カスタムトークンからIDトークンを取得するには、最初に signInWithCustomToken()
を呼び出します。次に、サインインしたユーザーインスタンスで getToken()
を呼び出します。
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
})
}
})