我已经将这个确切的功能从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运行时。
将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] 删除。
我来说两句