【发布时间】:2019-01-19 02:56:28
【问题描述】:
首先,我使用 nodejs 作为后端。我使用 firebase 托管和 firebase 函数来部署 express() 应用程序。
我想要实现的是创建一个连接到 Firebase 的管理网站。所以我有一条这样的路线/admin/:
adminApp.get("/", (request, response) => {
return response.redirect("/admin/login");
});
在这里,我基本上想检查当前用户是否已登录 - 或未登录。 我知道firebase支持客户端身份验证使用:
firebase.auth().onAuthStateChanged(user => {
if (user) {
} else {
}
});
并使用
function login() {
var userEmail = document.getElementById("email").value;
var userPass = document.getElementById("password").value;
firebase.auth().signInWithEmailAndPassword(userEmail, userPass).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
if (error) {
document.getElementById('loginError').innerHTML = `Error signing in to firebase`;
}
});
}
然而图像这种情况:
有人(不是管理员)正在访问/admin/some_secret_website/,他显然无权访问。
如果我依赖客户端身份验证,它首先加载整个网站和脚本,然后通知 - 嘿,我没有通过身份验证,让我重定向到 /login。到那时,任何人都知道管理页面的源代码。
我宁愿有类似的东西:
adminApp.get("/admin/some_secret_website", (request, response) => {
if (request.user) {
// user is authenticated we can check if the user is an admin and give access to the admin page
}
});
我知道您可以使用 AdminSDK 获取用户的令牌并验证该令牌,但该令牌必须由客户端代码发送,这意味着该网站已经加载。
我通过 firebase 遇到了Authorized HTTPS Endpoint,但它只允许在使用不记名令牌时使用中间件。
有人知道我可以如何维护服务器端用户对象,甚至不将管理员 html 返回到浏览器,而只允许管理员访问吗?
【问题讨论】:
-
您在示例中提到的中间件可以很容易地重写为内联代码,以便在应受保护的函数中直接调用。
标签: firebase google-cloud-functions firebase-analytics firebase-hosting firebase-admin