Firebase Web管理员

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

首先,我使用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\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的内容。

您在示例中提到的中间件可以很容易地重写为内联代码,以便在应保护的函数中直接调用。