我在Firebase托管上托管了一个静态应用,后端也在Firebase上(使用firebase JS api进行通信)。我想在本网站的所有页面上添加一个简单的身份验证页面,以便只有我想要的用户才能访问此站点。这可能吗?
看了一下这些文档,但在这方面找不到任何可以帮助我的东西。
您可以使用Firebase功能和Express呼叫执行此操作。将所有静态文件放入名为functions/admin
的文件夹中,并将此函数放入functions/index.js
:
exports.admin = functions.https.onRequest((req, res) => {
const url = req.originalUrl ? req.originalUrl : '/index.html' // default to index.html
res.sendfile('admin' + url)
})
然后,向/admin/*
的函数服务器发出的请求将提供相同名称的文件。
如果您想添加授权,请尝试以下操作:
exports.admin = functions.https.onRequest(async (req, res) => {
const url = req.originalUrl ? req.originalUrl : '/index.html'
const user = await get_user(req) // get the current user
if (user && user.is_admin) // is current user an admin?
res.sendfile('admin' + url)
else {
res.status(403).send(null)
}
})
您将不得不定义get_user()
,以便返回带有is_admin
字段的用户对象。
Firebase Hosting无法限制对您网站的静态资源(HTML,CSS,JavaScript)的访问。见Can Firebase hosting restrict access to resources?,Firebase Hosting - Members Only / Secured Webpages?。
但是,如果您的网站提供动态内容(例如loads data from the Firebase Database from JavaScript或uploads images to Firebase Storage),您可以使用Firebase身份验证以及这些产品的服务器端安全规则(database,storage)来确保用户只能采取他们授权的操作。
这可以通过向Firebase数据库添加规则来实现,只允许经过身份验证的用户进入您可以使用的网站:
// These rules require authentication
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
你可以用这个:
{
"rules": {
"admin": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}
使用上面的内容,您将只允许admin
节点下的用户(必须通过身份验证)才能写入数据库,而其他任何人都无法写入。