为什么从Firebase身份验证传递ID令牌时,此经过CORS身份验证的Google Cloud Function为什么返回403?

时间:2019-11-22 01:04:25

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

我已经将这个确切的功能从google cloud function tutorial部署到了我的Google云项目。

在客户端,使用firebase signInWithPopup身份验证对最终用户进行身份验证。 id令牌通过user.getIdToken().then(token => { ... // ... }从结果用户获取。

然后通过有角度的httpclient调用对端点进行调用:

const url = 'https://[MY-PROJECT-SUBDOMAIN].cloudfunctions.net/hello_get/';
this.auth.user.getIdToken().then(token => {
    const httpOptions = {
        headers: new HttpHeaders({
            'Authorization': `Bearer ${token}`
        })
    };
    this.http.get(url, httpOptions).subscribe(response => {
        console.log(response);
    }, error => {
        console.error(error);
    });
});

响应是对OPTIONS飞行前请求的403,这使我认为Google正在拒绝我的ID令牌。我在hello_get函数中添加了函数日志。似乎该函数甚至没有被调用,因为返回403响应时此日志永远不会出现。

当“ Cloud Functions Invoker”的功能权限设置为allUsers时,Cloud功能可以通过CORS正常工作,但是一旦我删除该权限并为allAuthenticatedUsers添加权限,并尝试使用{{1}传递令牌, },然后返回403。

所以-看来根本原因是Google拒绝了印前检查OPTIONS请求。如果是这种情况,建议通过哪种方式与经过身份验证的Firebase用户调用经过身份验证的Google Cloud函数?

注意:我在这里使用的是Google Cloud函数而不是firebase函数,因为我们需要使用在firebase函数中不可用的python3运行时。

1 个答案:

答案 0 :(得分:1)

将Firebase身份验证与Google Cloud功能一起使用时,不会通过IAM角色对用户进行身份验证。而是在功能本身内对它们进行身份验证。请注意,根据Google的文档,“由于该功能必须有效地验证令牌,因此您需要为未经身份验证的请求付费”。要进行设置:

(1)需要向allUsers(而不是我拥有的allAuthenticatedUsers)开放该功能上的“ Cloud Functions Invoker”的IAM权限。

(2)然后使用firebase_admin的身份验证库(docs,供参考和其他语言)手动完成令牌验证,如下所示:

from firebase_admin import auth

def your_function(request):
    decoded_token = auth.verify_id_token(id_token)
    uid = decoded_token['uid']

感谢Juancki向我指出了正确的方向。