提问人:Schorsch 提问时间:11/17/2023 最后编辑:Doug StevensonSchorsch 更新时间:11/17/2023 访问量:30
Firebase 通过 Admin SDK 使用服务帐号对请求进行身份验证
firebase authenticating requests using service account with admin sdk
问:
我正在尝试使用带有服务帐户的管理 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 很陌生,如果我的描述缺少信息,很抱歉。
答:
0赞
Doug Stevenson
11/17/2023
#1
错误消息告诉您,您不能用于验证自定义令牌,因此您正在尝试的操作将永远无法正常工作。该函数用于验证来自用户登录的 Web 或移动应用程序的用户 ID 令牌。verifyIdToken()
如果您已为用户生成了自定义令牌,则需要使用该令牌通过 Firebase Auth 在客户端应用中使用 登录用户,然后,您可以使用 获取用户的 ID 令牌。只有该令牌才能传递到后端并使用 进行验证。signInWithCustomToken()
getToken()
verifyIdToken()
评论
0赞
Schorsch
11/20/2023
嘿道格,非常感谢您的帮助。我能够生成一个自定义令牌并使用 jsonwebtoken 的解码函数对其进行验证。
评论