【问题标题】:Is it possible to require a password to access a site hosted on firebase?是否可以要求密码才能访问托管在 firebase 上的网站?
【发布时间】:2015-09-28 04:35:21
【问题描述】:

我正在使用 firebase 托管一个网站,并希望能够阻止人们访问它,尝试使用 .htaccess 文件,想知道以前是否有人能够做到这一点。

【问题讨论】:

  • Firebase 托管目前不支持此功能。
  • 谢谢,很高兴知道!
  • 如果我理解正确的话,Firebase Hosting 是在 Node.js 平台之上提供的,所以理论上这应该是可能的......(我没有测试过):sitepoint.com/http-authentication-in-node-js跨度>

标签: firebase firebase-hosting


【解决方案1】:

这里有一个小技巧,它使用 Firebase 云功能和一些文件重新排列来模拟 HTTP 基本身份验证。

这有 3 个步骤:

  1. 设置必要的云功能
  2. 将要保护的文件移动到“秘密”文件夹中
  3. 更新您的firebase.json

1。云函数

const USERNAME = 'USERNAME'
const PASSWORD = 'PASSWORD' 
const denyAccess = (res) => {
  res.statusCode = 401;
  res.setHeader('WWW-Authenticate', 'Basic realm="Authorization 
  Required');
  res.end('Unauthorized');
}

exports.authorizeAccess = functions.https.onRequest((req, res) => {
  if (typeof req.headers.authorization !== 'string') {
    denyAccess(res);
    return;
  }

  const base64Auth = req.headers.authorization.split(' ')[1];
  if (typeof base64Auth !== 'string' ) {
   denyAccess(res);
   return;
  }

  const [user, pass] = Buffer.from(base64Auth, 
  'base64').toString().split(':');
  if (user !== USERNAME || pass !== PASSWORD) {
    denyAccess(res);
    return;
  }

  const urlObject = url.parse(req.url);
  urlObject.pathname = 
  `/${PASSWORD}${urlObject.pathname}`;
  const location = url.format(urlObject);

  res.writeHead(302, { location });
  res.end();
});

2。将文件移动到秘密文件夹

假设您在firebase.json 中设置为public 的文件夹如下所示:

.
├── index.html
├── js
|   ├── main.js
|   └── main.js.map
└── styles.css

然后让它看起来像这样

.
└── PASSWORD
    ├── index.html
    ├── js
    |   ├── main.js
    |   └── main.js.map
    └── styles.css

3。 firebase.json

{
  ...
  "rewrites": {
    "source": "/"
    "function": "authorizeAccess"
  }
  ...
}

我们必须在生产中使用密码保护我们的源地图;我们必须首先把它们放在那里,这样哨兵才能把它捡起来。我们的构建脚本会负责将文件移动到必要的文件夹中。

【讨论】:

  • 很好的解决方法。我想这是在 Google 为其静态云托管解决方案引入 专用 身份验证和授权系统之前的方式。 Google 实际上承认它是"popular request"。让我们看看他们什么时候说话。感谢您分享您的解决方案,Rajiv Ram! :D
  • 澄清一下,这只需要在顶层进行身份验证,如果 URL 已知,则可以直接访问名为 password 的子文件夹。访问子文件夹时无法运行该功能。
  • 云函数中的url是什么?
  • 知道了,我相信它就像导入其中一个 nodejs 模块一样简单。 const url = require('url');
【解决方案2】:

如果您正在托管一个网站,并且想要访问您网站上的 Firebase 数据,您可以向您的应用程序添加身份验证以控制谁可以更改或查看数据。根据手册:Firebase Authentication

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多