【问题标题】:Firebase Web AdminFirebase 网络管理员
【发布时间】: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


【解决方案1】:

就像 Doug 指出的那样,您的管理网站/webapp 与 Firebase Cloud Functions(实际上是一个 Nodejs 服务器)一起运行的方式是您获取请求,然后使用标头令牌针对 Firebase Auth 对它们进行身份验证。请参阅this answer 获取有关此的代码 sn-p。

在您的情况下,我认为您会为“管理员”组创建一个custom claim,并使用它来确定是否在身份验证时发送一个 pug 模板页面作为响应。至于授权,您的数据库规则将确定所述用户可以 CRUD 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2012-03-03
    • 2018-01-23
    • 2018-04-03
    相关资源
    最近更新 更多