使用 jsonwebtoken 时验证 firebase 自定义令牌以获取令牌 ID 失败
Verifying firebase custom token to get token ID fails when using jsonwebtoken
在后端通过 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
这个需要签名吗?如果有人可以解释这个或有任何指示?
更新:
当 运行 req.headers.authorization.split('Bearer ')[1]
到 jwt.io 表示签名无效时,但随后我输入我的私钥 (key
) 并验证它。
我得到的方法调用不正确或将错误的参数传递给 jwt.verify()
吗?
您似乎在使用自定义令牌调用 verifyIdToken
。那是行不通的。 verifyIdToken
只接受 "ID tokens"。要从自定义令牌获取 ID 令牌,请先在登录的用户实例上调用 signInWithCustomToken()
. Then call 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
})
}
})
在后端通过 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
这个需要签名吗?如果有人可以解释这个或有任何指示?
更新:
当 运行 req.headers.authorization.split('Bearer ')[1]
到 jwt.io 表示签名无效时,但随后我输入我的私钥 (key
) 并验证它。
我得到的方法调用不正确或将错误的参数传递给 jwt.verify()
吗?
您似乎在使用自定义令牌调用 verifyIdToken
。那是行不通的。 verifyIdToken
只接受 "ID tokens"。要从自定义令牌获取 ID 令牌,请先在登录的用户实例上调用 signInWithCustomToken()
. Then call 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
})
}
})