Google PHP Api客户端-我不断收到错误401:未经授权

时间:2019-02-22 00:06:47

标签: php google-api google-cloud-functions google-api-php-client

我已经为这个问题苦苦挣扎了好几个小时了,即使不是几天,似乎也无法解决。

我对云功能的请求被拒绝,错误代码: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上。

2 个答案:

答案 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());
}