我使用 Firebase 部署了一个静态网站,并设置了
authenticateUser
功能和托管重定向,试图 (1) 拒绝未经身份验证的访问者对所有网站内容的访问,但 (2) 向特定用户组授予访问权限(Google 帐户电子邮件地址)通过 Google 登录。我请求帮助排除故障或修改以下方法,但该方法不起作用:
<firebase project>/functions/index.js
:const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.authenticateUser = functions.https.onRequest((req, res) => {
const idToken = req.headers.authorization;
if (!idToken) {
return res.status(401).send('Unauthorized');
}
admin.auth().verifyIdToken(idToken)
.then(decodedToken => {
const email = decodedToken.email;
const authorizedEmails = ['[email protected]', '[email protected]'];
if (authorizedEmails.includes(email)) {
res.status(200).send('Authorized');
} else {
res.status(403).send('Forbidden');
}
})
.catch(error => {
res.status(401).send('Unauthorized');
});
});
<firebase project>/firebase.json
{
"hosting": {
"rewrites": [
{
"source": "**",
"function": "authenticateUser"
}
]
}
}
实施这些更改后,网站仍然对公众开放,而我的预期目标是通过 Google 登录界面提示所有访问者,并仅向
authorizedEmails
列表中的访问者提供内容。
有许多看似相关的问题,例如这个问题,但我发现没有一个可以解决这里的基本问题。
Firebase 托管始终会在任何函数重写之前提供与请求路径匹配的静态内容。 来自文档:
托管响应的优先顺序
本节中描述的不同 Firebase 托管配置选项 页面有时会重叠。如果存在冲突,则由托管决定 它使用以下优先级顺序进行响应:请注意,在配置重写之前
以 /__/* 路径段开头的保留命名空间
- 配置的重定向
- 精确匹配静态内容
- 配置重写
- 自定义404页面
- 默认404页面
提供完全匹配的静态内容。 所以基本上,您的策略不适用于 Firebase 托管。 你需要想出一些完全不同的东西。 如果您想完全阻止未经授权的用户访问静态网站内容,则必须通过在
每个请求上验证 id 令牌的函数来提供该内容,而不是通过正常部署的静态内容来提供该内容,这是不可能的这样保护。