【问题标题】:google-api-php-client: Invalid client secret JSON filegoogle-api-php-client:无效的客户端机密 JSON 文件
【发布时间】:2015-03-16 10:29:36
【问题描述】:

似乎最新版本的 google-api-php-client for PHP 不符合文档@@https://developers.google.com/drive/web/examples/php

查看 src 代码,我看到它正在下载的 JSON 中寻找 setAuthConfigFile() 方法找不到的密钥:client_secret、已安装、web、redirect_uris(其他?)在下载的 JSON 中不存在.只有 private_key_id、private_key、c​​lient_email、client_id 和 type 存在。

代码和文档似乎非常杂乱无章且不同步……对于 Google 来说,这不是第一个。最近有没有人使用该库让 OAuth 工作?

【问题讨论】:

  • 这方面有什么更新吗?这里有同样的问题。
  • @NebezBriefkani 我遇到了同样的问题。在我的例子中,client_secret.json 文件在 mac 上默认设置为read only。我对这个文件做了chmod 777(给了写权限),解决了这个问题。

标签: php oauth google-api-php-client


【解决方案1】:

1) “CREDENTIALS_PATH”应该指向一个不存在的文件(在可写路径中)

2) “CLIENT_SECRET_PATH”应指向“ID 客户端 OAuth 2.0”凭据文件,该文件是从 Google 控制台的 Api 凭据部分创建和下载的。

对于像您这样的服务器端 php 脚本,在创建“ID 客户端 OAuth 2.0”记录时要注意:在创建向导中,您应该选择“其他”类型的应用程序,而不是“网络”类型。

问候

【讨论】:

  • 我确信我会花很长时间寻找它自己找到它,但它会在哪里?
【解决方案2】:

php 库中有一个新函数接近这个,但不允许设置 sub,所以总是给授权失败。所以,首先将 src/Google/Client.php 中的 php 库函数 loadServiceAccountJson 更新为:

  public function loadServiceAccountJson($jsonLocation, $scopes)
  {
    $data = json_decode(file_get_contents($jsonLocation));
    if (isset($data->type) && $data->type == 'service_account') {
      // Service Account format.
      $cred = new Google_Auth_AssertionCredentials(
          $data->client_email,
          $scopes,
          $data->private_key,
          'notasecret',
          'http://oauth.net/grant_type/jwt/1.0/bearer',
          $data->sub
      );
      return $cred;
    } else {
      throw new Google_Exception("Invalid service account JSON file.");
    }
  }

然后,在您的服务器身份验证 json 文件中的数据中添加一个值 sub:

{
  "private_key_id": "removed",
  "private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n",
  "client_email": "removed",
  "client_id": "removed",
  "redirect_uris":[your urls here],
  "type": "service_account",
  "sub": "valid.user@google.domain.com"
}

现在,获得授权:

$credentials = $client->loadServiceAccountJson('serverauth.json',"https://www.googleapis.com/auth/admin.directory.user.readonly");
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion();
}

其中 serverauth.json 是从您要使用的服务帐户下载的 JSON 密钥文件,并添加了子行。

最后,创建一个 Directory 实例并查询它:

$service = new Google_Service_Directory($client);
$optParams = array(
        'domain' => 'google.domain.com',
        'orderBy' => 'email',
        'viewType' => 'domain_public',
        'query' => "givenName:'Joe' familyName:'Schmoe Jr'"
);
$results = $service->users->listUsers($optParams);
$users = $results->getUsers();

print_r($users);

【讨论】:

    【解决方案3】:

    我了解您的风险,您在使用 Google API 时遇到了问题。在 Google API 控制台中有 3 种 json 文件,一种是 Web ,第二种是 Service ,最后一种是 Installed。您需要使用的选择是 Installed,因为您将获得 Key、Installed 或其他..

    【讨论】:

      【解决方案4】:

      “服务帐户”“网络应用程序”调用 API 是有区别的。当您创建“服务帐户”时,您将获得上述文件,一个带有private_keyclient_emailclient_id 等的 JSON 文件。

      当您创建一个网络应用程序时,您将获得一个client_idclient_secretredirect_uri 等。

      我建议阅读这些页面以选择您需要的密钥和登录名(在这两个页面上您都可以找到将其集成到 PHP 中的示例):

      您可以使用适用于 PHP 的 Google API 客户端库来创建 Web 使用 OAuth 2.0 授权访问 Google 的服务器应用程序 蜜蜂。 OAuth 2.0 允许用户与 应用程序,同时保留他们的用户名、密码和其他 信息私密。例如,Web 应用程序可以使用 OAuth 2.0 获得用户的许可以将文件存储在他们的 Google 云端硬盘中。

      https://developers.google.com/api-client-library/php/auth/web-app

      通常,应用程序在应用程序使用服务帐户时 使用 Google API 处理自己的数据,而不是用户的数据。 例如,使用 Google Cloud Datastore 存储数据的应用程序 持久性将使用服务帐户来验证其对 Google Cloud Datastore API。

      https://developers.google.com/api-client-library/php/auth/service-accounts

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 2012-12-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        • 2017-07-13
        相关资源
        最近更新 更多