为什么在通过 Firebase 身份验证传递 id 令牌时,经过 CORS 身份验证的 Google Cloud 函数会返回 403?

2023-12-01

我已经从以下位置部署了这个确切的功能谷歌云功能教程到我的谷歌云项目。

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

然后通过 Angular 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。

所以 - 根本原因似乎是谷歌拒绝预检选项请求。如果是这种情况,那么使用经过身份验证的 Firebase 用户调用经过身份验证的谷歌云功能的推荐方法是什么?

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


将 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']

感谢胡安基为我指明了正确的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在通过 Firebase 身份验证传递 id 令牌时,经过 CORS 身份验证的 Google Cloud 函数会返回 403? 的相关文章

随机推荐