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

mpkasp

我已经将这个确切的功能从google cloud功能教程部署到了我的google cloud project。

在客户端,使用FirebasesignInWithPopup身份验证对最终用户进行身份验证。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响应时此日志永远不会出现。

当“云函数调用程序”的功能权限设置为allUsers时,云功能可以通过CORS正常工作,但是一旦我删除了该权限并为allAuthenticatedUsers添加了权限,并尝试Access-Control-Allow-Credentials': 'true'在云函数中传递令牌,即403返回。

所以-看来根本原因是Google拒绝了飞行前OPTIONS请求。在这种情况下,建议使用经过身份验证的Firebase用户调用经过身份验证的Google Cloud函数的方法是什么?

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

mpkasp

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

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

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

from firebase_admin import auth

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章