如何设置 Google 登录以便为 Google Firebase 上托管的静态网站提供服务器端身份验证?

问题描述 投票:0回答:1

我使用 Firebase 部署了一个静态网站,并设置了

authenticateUser
功能和托管重定向,试图 (1) 拒绝未经身份验证的访问者对所有网站内容的访问,但 (2) 向特定用户组授予访问权限(Google 帐户电子邮件地址)通过 Google 登录。我请求帮助排除故障或修改以下方法,但该方法不起作用:

  1. 在 Firebase 控制台中启用 Google 登录。
  2. 将以下代码添加到
    <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');
    });
});
  1. 添加以下代码到
    <firebase project>/firebase.json
{
  "hosting": {
    "rewrites": [
      {
        "source": "**",
        "function": "authenticateUser"
      }
    ]
  }
}

实施这些更改后,网站仍然对公众开放,而我的预期目标是通过 Google 登录界面提示所有访问者,并仅向

authorizedEmails
列表中的访问者提供内容。

有许多看似相关的问题,例如这个问题,但我发现没有一个可以解决这里的基本问题。

firebase google-cloud-platform firebase-authentication google-cloud-functions firebase-hosting
1个回答
0
投票

Firebase 托管始终会在任何函数重写之前提供与请求路径匹配的静态内容。 来自文档

托管响应的优先顺序

本节中描述的不同 Firebase 托管配置选项 页面有时会重叠。如果存在冲突,则由托管决定 它使用以下优先级顺序进行响应:

    以 /__/* 路径段开头的保留命名空间
  • 配置的重定向
  • 精确匹配静态内容
  • 配置重写
  • 自定义404页面
  • 默认404页面
请注意,在配置重写之前

提供完全匹配的静态内容。 所以基本上,您的策略不适用于 Firebase 托管。 你需要想出一些完全不同的东西。 如果您想完全阻止未经授权的用户访问静态网站内容,则必须通过在

每个

请求上验证 id 令牌的函数来提供该内容,而不是通过正常部署的静态内容来提供该内容,这是不可能的这样保护。

© www.soinside.com 2019 - 2024. All rights reserved.