21

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

4

2 回答 2

18

这是一个小技巧,它使用 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.将文件移动到秘密文件夹

假设您设置的文件夹如下所示publicfirebase.json

.
├── 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"
  }
  ...
}

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

于 2018-01-30T10:37:42.537 回答
5

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

于 2015-07-09T21:01:12.307 回答