【问题标题】:Firebase set up rewrites to pass current user to Cloud FunctionFirebase 设置重写以将当前用户传递给 Cloud Function
【发布时间】:2017-08-02 15:49:43
【问题描述】:

我正在尝试使用 Cloud Functions for Firebase 来提供内容,并且我想检测用户是否已登录。我在我的 firebase.json 中设置了一个重写,如下所示:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "public",
    "rewrites": [{
      "source": "**",
      "function": "getProfile"
    }]
  }
}

这很好用,我正在根据请求的路径提供适当的内容。但是,因为我没有在客户端做任何事情(即我使用的是重写而不是客户端重定向),所以我错过了从客户端脚本获取当前用户的机会。

有什么方法可以使用请求对象的标头或属性,以便在我的服务器端重写方案中为登录用户和未登录用户提供不同的内容?

【问题讨论】:

  • 从这个示例开始 - 它可能会让您从一些想法开始。 github.com/firebase/functions-samples/tree/master/…
  • @DougStevenson 感谢您的提示。我正在浏览那个 repo 并看到了 req.headers.authorization.startsWith('Bearer ') 代码...看起来很有希望 - 谢谢!
  • 是的,Authorization 标头用于包含 Firebase 身份验证令牌,然后在函数端进行验证。
  • @DougStevenson 那么使用这种方法是否会更改所有前端页面以拦截客户端的所有请求并在发布到后端之前添加标头?我不能设置 Firebase 为所有登录用户自动发送身份验证令牌标头吗?
  • 老实说,我不确定它在您的情况下如何工作。也许将令牌放在 cookie 中,以便可以从客户端对其进行操作?

标签: firebase firebase-authentication google-cloud-functions


【解决方案1】:

Firebase 托管在调用云函数时会传递任何名为 __session 的 cookie。一个简单的方法是在您的网络应用程序中侦听 ID 令牌并适当地设置 cookie:

firebase.auth().onIdTokenChanged(user => {
  if (user) {
    user.getIdToken().then(token => {
      document.cookie = `__session=${token};max-age=3600`;
    });
  } else {
    document.cookie = '__session=;max-age=0';
  }
});

然后,在您的 Cloud Function 中,您可以从 cookie 中解析出 ID 令牌并使用代码 like in this sample 进行验证。

【讨论】:

  • 谢谢迈克尔 - 所以如果我在用户登录时设置 cookie,所有未来的请求,包括那些被重写为云函数的端点的请求都会传递 cookie(直到它过期)?即,我不需要做任何事情来促进在客户端为每个请求传递 cookie。
  • 正确,浏览器会自动传递 cookie。但是,ID 令牌仅持续 1 小时,这就是为什么将到期时间设置为一小时,我们正在监听 onIdTokenChanged(刷新 id 令牌时触发)。
  • 谢谢...我会编写代码,看看它是否像我希望的那样工作。
猜你喜欢
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2021-01-05
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多