【问题标题】:How to set Authorization header while calling "callable function" on Firebase如何在 Firebase 上调用“可调用函数”时设置授权标头
【发布时间】:2020-08-01 11:06:54
【问题描述】:

基本上我的问题是,我在 Firebase 上有我的可调用函数,我想使用“上下文”来识别用户是否经过身份验证。在前端,我使用 Firebase 身份验证(这是 firebase 上的 http 函数)登录用户,结果我得到了我的用户令牌(应该用作授权标头中的 Bearer 令牌)。问题是当我登录用户时我不确定如何设置标题,以便我的“context.auth”将包含登录的用户信息而不是空的。我使用firebase.functions().httpsCallable('myFunction');,因为文档建议从出现问题的前端进行调用,即使我在进行此调用之前已登录,但我的上下文为空。

为了提供更多上下文考虑以下场景,

//Backend (deployed to cloud functions)
exports.signout = functions.https.onCall((data, context) => {
    if(context.auth){
        //do signout stuff and return true
    }
    else{
        //not logged in so you can't sign out return false
    }
});


//Client
let signout = firebase.functions().httpsCallable('signout');
signout()
    .then(res => console.log("signed out"))
    .catch(err => console.log(err))

简单地说,在客户端创建httpsCallable('signout') 时,根据文档,我应该在“授权”标头中包含用户令牌,以便我可以从我的可调用函数访问context.auth。我不明白的是应该如何在那里设置标题?最合乎逻辑的事情是在登录时设置它,但它不像为 axios 设置默认标头,因为调用不完全是一个 http 请求,而是我们使用那个特殊的 httpsCallable 函数。那么应该如何/何时设置 auth 标头?

【问题讨论】:

  • 你能分享你的代码吗? Cloud Function 以及身份验证机制。
  • @RenaudTarnec 我刚刚更新了我的问题以解释我对可调用函数机制的理解。
  • 您说“在前端,我正在使用 Firebase 身份验证(这是 firebase 上的 http 功能)登录用户”。您如何准确地进行身份验证?你用JavaScript SDK吗?如果不是,是什么原因?
  • 我在云端的登录功能中使用firebase.auth().signInWithEmailAndPassword
  • 如果您使用的是firebase.auth().signInWithEmailAndPassword(),它应该可以工作:身份验证成功后,Firebase 身份验证令牌会自动包含在对可调用函数的请求中。您的身份验证代码中可能有错误。您应该分享它以便我们能够帮助您。

标签: firebase google-cloud-functions


【解决方案1】:

当您使用提供的 SDK 从 Web 或移动客户端使用可调用类型函数时,会自动处理 HTTP 协议的所有细节。您无需设置任何标题。

如果用户在请求时当前已登录,SDK 会自动添加授权标头。如果用户退出,则不会添加任何标题。所以,如果你想在最终用户的授权下调用signout,你显然必须在他们登录时调用它。

听起来您可能在调用可调用对象之前退出了用户。在这种情况下,您的函数将不会收到任何用户数据。

【讨论】:

  • 是的,我认为情况并非如此,因为我的 signout 函数实际上并没有做任何与注销相关的事情。所以我相信问题是我没有从客户端调用firebase.auth().signInWithEmailAndPassword(),而是调用了一个端点,它在该函数内部进行了登录(函数在服务器/云上运行)。因此,如果我实际上从前端运行 firebase 登录,那么它应该可以工作。如果我错了,请纠正我。
  • 您只能从前端登录。没有后端登录。
猜你喜欢
  • 2021-03-02
  • 2011-03-03
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多