Firebase 托管的身份验证

Posted

技术标签:

【中文标题】Firebase 托管的身份验证【英文标题】:Authentication for firebase hosting 【发布时间】:2018-07-23 01:14:42 【问题描述】:

我有一个托管在 Firebase 主机上的静态应用程序,其后端也在 Firebase 上(使用 firebase JS api 进行通信)。我想在这个网站的所有页面上添加一个简单的身份验证页面,这样只有我想要的用户才能访问这个网站。这可能吗?

查看了文档,但在这方面没有找到任何对我有帮助的东西。

【问题讨论】:

@PeterHaddad 我为单个用户开发了这个,但由于它托管在 firebase 上,网络不需要任何注册,只需要一个可用于访问此站点的帐户。跨度> 【参考方案1】:

您可以使用 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 字段的用户对象。

【讨论】:

你停止解释我猜最重要的部分,身份验证。您能否详细说明如何从 Request 对象中获取当前用户(即使用 get_user(req))? 添加执行身份验证的中间件,可能是这样的:codementor.io/@victornwaiwu/…【参考方案2】:

这可以通过向您的 Firebase 数据库添加规则来完成,只让经过身份验证的用户进入您可以使用的网站:

// These rules require authentication

 "rules": 
   ".read": "auth != null",
   ".write": "auth != null"
  

你可以用这个:

 
 "rules": 
   "admin": 
       "$uid": 
          ".write": "$uid === auth.uid"
      
    
  

使用上述方法,您将只允许admin 节点下的用户(他们必须经过身份验证)写入数据库,其他人不能。

更多信息在这里:https://firebase.google.com/docs/database/security/

【讨论】:

这是用于 Firebase 数据库,而不是用于托管。 @Dimitri OP希望一些用户访问该网站,并且有规则可以做到,甚至第一个答案都说you can use Firebase Authentication plus the server-side security rules (database, storage) of those products to ensure users can only take actions they're authorized for.【参考方案3】:

Firebase 托管无法限制对您网站的静态资源(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 托管的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 身份验证和托管将登录用户重定向到子域?

带有苹果登录的 Firebase 身份验证网络

SPA - Firebase 和 .Net WebApi 2 身份验证

只有一个帐户的Firebase身份验证

身份验证状态持久性未按预期工作 ReactJS

Flutter Web和Firebase身份验证TypeError:无法读取未定义的属性'app'