我部署了两个Firebase函数,一个使用functions.https.onRequest
(companyRequest
),另一个使用functions.https.onCall
(companyCall
)。两者的作用完全相同:从firestore检索文档(从完全相同的集合中检索完全相同的文档)。
以下是功能:
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp(functions.config().firebase);
export const companyRequest = functions.https.onRequest((request, response) => {
const companyId = "VpOVFo82m9ls3aIK7dra";
admin
.firestore()
.collection("company")
.doc(companyId)
.get()
.then(result => {
response.send(result.data());
})
.catch(error => {
response.send(error);
});
});
export const companyCall = functions.https.onCall((data, context) => {
if (context && context.auth) {
console.log(
"AUTH",
context.auth.uid,
context.auth.token.email
);
}
const companyId = "VpOVFo82m9ls3aIK7dra";
admin
.firestore()
.collection("company")
.doc(companyId)
.get()
.then(result => {
return result.data();
})
.catch(error => {
return error;
});
});
我用companyRequest
呼叫curl
,它有效:
> curl https://us-central1-xxxxx.cloudfunctions.net/company
{"name":"Duny Comp."}
我从抖动中呼叫companyCall
并失败了(在Firebase,服务器站点上):
Future click() async {
final HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
functionName: 'companyCall',
);
HttpsCallableResult resp = await callable.call(<String, dynamic>{
'companyId': 'VpOVFo82m9ls3aIK7dra',
});
print(resp.data);
}
我为companyCall
遇到的错误是:
AUTH 3gvfgYJpk2gIgUpkOLxdkdId uuuu@xxxx.com
ERROR: Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information
错误似乎很明显,但是为什么使用curl进行未经身份验证的调用会起作用,但是通过flutter进行Firebase身份验证的companyCall
确实存在权限问题?在输出中,您甚至可以在flutter应用程序中查看来自最终用户的身份验证信息,以便对他进行身份验证。
问题是,为什么两者之间有区别?像Error: Could not load the default credentials (Firebase function to firestore)这样的提议解决方案也感到很奇怪...
更新:
这与Firebase Cloud Functions中的问题不同:Difference between onRequest and onCall,在这个问题中,我问为什么两种不同方法在安全性方面存在差异。为什么从onCall
方法访问集合时,为什么我需要使用管理员帐户进行身份验证才能从onRequest
访问同一集合?