【发布时间】:2021-10-17 05:28:58
【问题描述】:
背景: 我有三个实体(语言: JS):
- 浏览器上的客户端
- 谷歌云函数
- HTTP 服务器 [具有 Firebase 管理员身份验证中间件]
所以,从 1 和 2,我想使用 HTTPS 调用与 3 通信。 因为 3 已经有管理员身份验证,所以我可以授权来自客户端的调用 (1)。
但我想知道如何授权来自谷歌云功能的调用(2),以便我可以安全地与两个实体通信。
令牌认证中间件:
const validateFirebaseIdToken = async (req: any, res: any, next: any) => {
console.log(await auth.getCredentials());
if (
(!req.headers.authorization ||
!req.headers.authorization.startsWith("Bearer ")) &&
!(req.cookies && req.cookies.__session)
) {
console.log(
"No Firebase ID token was passed as a Bearer token in the Authorization header." +
"Make sure you authorize your request by providing the following HTTP header:" +
"Authorization: Bearer <Firebase ID Token>" +
'or by passing a "__session" cookie.'
);
res.status(403).send("Unauthorized 1");
return;
}
let idToken;
if (
req.headers.authorization &&
req.headers.authorization.startsWith("Bearer ")
) {
console.log('Found "Authorization" header');
// Read the ID Token from the Authorization header.
idToken = req.headers.authorization.split("Bearer ")[1];
} else if (req.cookies) {
console.log('Found "__session" cookie');
// Read the ID Token from cookie.
idToken = req.cookies.__session;
} else {
// No cookie
res.status(403).send("Unauthorized 2");
return;
}
try {
const decodedIdToken = await admin.auth().verifyIdToken(idToken);
req.user = decodedIdToken;
next();
return;
} catch (error) {
console.log("Error while verifying Firebase ID token:" + error);
res.status(403).send("Unauthorized 3");
return;
}
};
【问题讨论】:
标签: node.js firebase firebase-authentication google-cloud-functions authorization