如何让 FirebaseFunctions.instance.httpsCallable() 传递 Authorization 标头? (使用颤振)

时间:2021-04-09 20:31:08

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

我正在努力获取包含在对 httpsCallable() 的调用中的用户 ID 令牌。我从颤振中这样称呼它:

Future<bool> cfCreateAccount(String name, address, email, phoneNumber, password, randomSalt, {int? parentId}) async {
  HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('createAccount', options: HttpsCallableOptions(timeout: Duration(seconds: 10)));
  try {
    var param = {'name': name, 'address': address, 'email': email, 'phone_number': phoneNumber, 'password': password, 'random_salt': randomSalt};
    final HttpsCallableResult result = await callable.call(param);
    if (result.data['response'] == 'Pass') {
      return true;
    }
  } catch (e) {
    print("Failed Cloud Function Call: $e");
  }
  return false;
}

这个人问了我认为类似的问题,但他们说答案是自动包含授权:

How to add headers to firebase httpscallable

我已经用这个登录了我的 Flutter 应用程序:

await auth.signInWithEmailAndPassword(email: user, password: password);

然后我可以调用 user.getIdToken() 并显示我的身份验证 ID。但是我尝试检查的每一种方式似乎都表明 auth 标头不在对云功能的请求中。

我用python写了云函数。它看起来像这样:

def createAccount(request):
    request_json = request.get_json(silent=True)
    request_args = request.args
    sql = None
    conn = None
    res = dict()

    res['data'] = str(request.authorization)
    return json.dumps(res)

但这会返回“无”。这意味着请求中没有授权。我也试过这个,但它在 python 中给出了一个错误:

token = request.headers['Authorization'].replace('Bearer ','')

我在颤振中调用 httpsCallable() 的方式可能有问题吗?我不确定 FirebaseFunctions.instance.httpsCallable() 如何从 FirebaseAuth.instance 获取身份验证 ID ??

这是 Firebase 控制台上的云函数,只是为了表明它在 python3.8 中存在:

1 个答案:

答案 0 :(得分:3)

似乎 Firebase Cloud Functions 的某些功能不可用,除非您使用 Firebase CLI 部署它们。 CLI 不支持 python,只支持 Javascript 和 Typescript。我建议使用这两种语言中的任何一种重写该函数,并通过 Firebase CLI 进行部署。

这里有一个类似的答案: https://stackoverflow.com/a/54583565/3822043