我已经从以下位置部署了这个确切的功能谷歌云功能教程到我的谷歌云项目。
在客户端,最终用户使用 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 运行时。