使用 Firebase 可调用函数时如何检索用户的身份验证数据?

Posted

技术标签:

【中文标题】使用 Firebase 可调用函数时如何检索用户的身份验证数据?【英文标题】:How can I retrieve the authentication data of a user when using a Firebase callable function? 【发布时间】:2020-10-04 10:08:15 【问题描述】:

我在 Flutter 中构建的移动应用程序使用 google 登录来注册用户。在这个应用程序中,我使用 Cloud Functions Plugin for Flutter 调用 Firebase 云函数(称为 questionAnswer)。

如果我从 this 文档中正确理解,https 请求应自动包含用户的 Firebase 身份验证。

如何从 Cloud Function 中检索用户的身份验证信息?我需要它来访问 Firebase 云数据库中与该特定用户关联的数据。我应该在 https 请求中包含谷歌身份验证令牌作为参数吗?

这是我在 Flutter 应用中的代码:

final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
      functionName: 'questionAnswer',
  );

 fetchHttps() async 
   dynamic resp = await callable.call();
   print(resp);
 

这是云函数中的代码

exports.questionAnswer = functions.https.onCall(() => 
  console.log('addNumbersLog', "holaLog");
    return answer;
  );

【问题讨论】:

【参考方案1】:

从documentation 中可以看出,auth 信息在传递给函数的第二个参数中。您需要声明并使用它:

exports.questionAnswer = functions.https.onCall((data, context) => 
  console.log('addNumbersLog', "holaLog");
  console.log(context.auth);
  return answer;
);

context 这里是一个CallableContext 对象。

【讨论】:

【参考方案2】:

您可以从CallableContext 参数中获取用户的uid,该参数作为第二个参数传递给您的onCall 处理程序。

从那里您可以使用.getUser() 方法检索Firebase UserRecord 并传入uid

exports.questionAnswer = functions.https.onCall((data,  auth ) => 
    admin.auth().getUser(auth.uid)
      .then((userRecord) => 
        // See the UserRecord reference doc for the contents of userRecord.
        console.log('Successfully fetched user data:', userRecord.toJSON());
      )
      .catch(function(error) 
        console.log('Error fetching user data:', error);
      );
  );
);

【讨论】:

以上是关于使用 Firebase 可调用函数时如何检索用户的身份验证数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用可调用的 Firebase 云函数

Firebase 可调用函数冷启动

如何使用 ReactJS 应用程序开发和测试 Firebase 可调用函数?

保护 Firebase 可调用函数免受中间人的影响

firebase - 从可调用云函数访问数据库时应用检查失败

应用检查对 Firebase 可调用函数的不必要强制执行