我已经为这个问题苦苦挣扎了好几个小时了,即使不是几天,似乎也无法解决。
我对云功能的请求被拒绝,错误代码:401:未授权。
我的代码如下:
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . FIREBASE_SERIVCE_PATH);
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope(Google_Service_CloudFunctions::CLOUD_PLATFORM);
$httpClient = $client->authorize();
$promise = $httpClient->requestAsync("POST", "<MyCloudFunctionExecutionUri>", ['json' => ['data' => []]]);
$promise->then(
function (ResponseInterface $res) {
echo "<pre>";
print_r($res->getStatusCode());
echo "</pre>";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
echo $e->getRequest()->getMethod();
}
);
$promise->wait();
由于我仍处于开发阶段,因此我目前正在从localhost执行此操作。
我的FIREBASE_SERIVCE_PATH常量链接到我的service_account js
我的云功能index.js:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
// CORS Express middleware to enable CORS Requests.
const cors = require('cors')({
origin: true,
});
exports.testFunction = functions.https.onCall((data, context) => {
return new Promise((resolve, reject) => {
resolve("Ok:)");
});
});
// [END all]
我的云功能日志:
Function execution took 459 ms, finished with status code: 401
我做错了什么,所以我未经身份验证?
PS:当我的Flutter移动应用使用以下命令进行调用时,我的testFunction可以完美运行:https://pub.dartlang.org/packages/cloud_functions
更新:
我遵循了以下指南:https://developers.google.com/api-client-library/php/auth/service-accounts,但是在“将域范围的权限委派给服务帐户”部分中,它仅说明如果我的应用程序在Google Apps域中运行,但是我不会使用Google Apps域,而且我在localhost上。
答案 0 :(得分:1)
可调用函数在常规HTTP函数之上加上protocol。通常,您使用Firebase客户端SDK调用它们。由于您没有可用于实现该协议的SDK,因此您必须自己遵循该协议。您不能像普通的HTTP函数那样仅仅调用它们。
如果您不想实现protocol,则应该使用常规的HTTP函数,并停止在移动应用程序中使用客户端SDK。
答案 1 :(得分:1)
首先,感谢道格·史蒂文森(Doug Stevenson)的上述回答!它帮助我获得了可调用函数(functions.https.onCall)的有效解决方案。 主要想法是,此类功能需要已登录的Firebase用户的auth上下文。它不是服务帐户,而是Firebase项目“身份验证”部分中的用户记录。因此,首先,我们必须授权用户,从响应中获取ID令牌,然后将该令牌用于请求以调用可调用函数。 因此,下面是我的工作摘要(实际上来自Drupal 8项目)。
void atrinkimas_2(vector <duomenys>& studentai, vector<duomenys> &silpni)
{
sort(studentai.begin(), studentai.end(), tikrinimas_gal);
std::vector<duomenys>::iterator it = std::find_if(studentai.begin(), studentai.end(), tikrinimas_5);
std::copy(it, studentai.end(), std::back_inserter(silpni));
studentai.resize(studentai.size() - silpni.size());
}