Firebase Web管理员
首先,我使用nodejs作为后端。我使用firebase主机和firebase函数部署Firebase Web管理员,firebase,google-cloud-functions,firebase-analytics,firebase-hosting,firebase-admin,Firebase,Google Cloud Functions,Firebase Analytics,Firebase Hosting,Firebase Admin,首先,我使用nodejs作为后端。我使用firebase主机和firebase函数部署express()应用程序 我试图实现的是建立一个管理网站,这是连接到Firebase。所以我有一个路径/admin/,如下所示: adminApp.get("/", (request, response) => { return response.redirect("/admin/login"); }); 这里我主要想检查当前用户是否登录。 我知道firebase支持客户端身份验证,使用: f
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\u secret\u网站/
。
如果我依赖客户端身份验证,它会首先加载整个网站和脚本,然后通知-嘿,我没有经过身份验证,让我重定向到/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,但它只允许在使用承载令牌时使用中间件
有人知道我如何维护服务器端用户对象,使其不向浏览器返回管理员html,而只允许访问管理员吗?正如Doug所指出的,您的管理员网站/webapp使用Firebase云功能(实际上是一个Nodejs服务器)的方式是,您获得请求,然后使用headers令牌根据Firebase Auth对其进行身份验证。请参阅,以获取有关此的代码片段
在您的情况下,我认为您应该为“管理员”组创建一个模板,并使用它来确定是否在身份验证时发送一个pug模板页面作为响应。就授权而言,您的db规则将确定所述用户可以CRUD的内容。您在示例中提到的中间件可以很容易地重写为内联代码,以便在应保护的函数中直接调用。