我已经将这个确切的功能从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运行时。
答案 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向我指出了正确的方向。