我正在尝试使用带有服务帐户的管理 SDK 在我的后端生成的令牌来验证来自第三方的服务器应用程序。出于测试目的,我尝试使用 Postman 来发送请求。我确实将生成的令牌放入邮差请求的标头中,方法是将 Authorization 添加为标头键,其值为 Bearer [token] 。 不幸的是,当查看 Firebase 日志资源管理器时,我收到错误:
verifyIdToken() 需要一个 ID 令牌,但得到了一个自定义令牌
这是创建令牌的代码:
const admin = require("./firebaseInit");
const uid = "test";
const generateToken = async (req, res) => {
try {
// Validation logic
const isValidService = true; // add more later(testing only)
if (!isValidService) {
return res.status(403).json({error: "Invalid service or application"});
}
// Set CORS headers
res.set("Access-Control-Allow-Origin", "https://omnibill-twl.web.app");
res.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
res.set("Access-Control-Allow-Headers",
"Origin, Content-Type, Accept, Authorization");
// Generate a token
const customToken = await admin.auth().createCustomToken(uid);
console.log("Custom Token:", customToken);
res.json({oneTimeToken: customToken});
} catch (error) {
console.error("Error generating one-time token:", error);
res.status(500).json({error: "Internal Server Error"});
}
};
module.exports = {generateToken};
这是获取令牌的代码:
const authHeader = req.header("Authorization");
const idToken = authHeader ? authHeader.split("Bearer ")[1] : null;
这是失败并出现错误的行:
// Verify the token
const decodedToken = await admin.auth().verifyIdToken(idToken);
我尝试在 https://jwt.io/ 上检查生成的令牌,它指出签名无效。 我不知道为什么,因为我使用 admin sdk,并且在创建新密钥后,它应该使用我从 Firebase 下载的 JSON 文件中的私钥自动对其进行签名。 我仔细检查了收到的密钥是否与创建的密钥相同并且它们匹配。 一般来说,我对 Firebase 和 JS 还很陌生,如果我的描述缺少信息,我很抱歉。
错误消息告诉您无法使用
verifyIdToken()
来验证自定义令牌,因此您尝试的操作永远不会起作用。该函数用于验证来自用户登录的网络或移动应用程序的用户 ID 令牌。
如果您为用户生成了自定义令牌,则需要使用该令牌通过 Firebase Auth 使用
signInWithCustomToken()
在客户端应用程序中登录用户,之后,您可以使用 获取用户的 ID 令牌getToken()
。您只能将该令牌传递到后端并使用 verifyIdToken()
进行验证。