Google OAuth2 服务帐户 API 授权

Posted

技术标签:

【中文标题】Google OAuth2 服务帐户 API 授权【英文标题】:Google OAuth2 Service Accounts API Authorization 【发布时间】:2013-08-21 23:53:00 【问题描述】:

我正在尝试通过 Google 的服务帐户身份验证来验证我的服务器应用程序,但由于某种原因,它只是没有通过。

在API console 中,我已经创建了项目,启用了我需要的服务(Admin SDK),并创建了服务帐户和 Web 应用程序 API 访问权限。

当我使用 Web 应用程序访问凭据时,我能够验证和检索用户记录。但是使用服务帐户身份验证会一直给我一个需要登录的消息。

"error":  "errors": [  "domain": "global", "reason": "required", "message": "Login Required", "locationType": "header", "location": "Authorization"  ], "code": 401, "message": "Login Required" 

我忘记添加了,我正在使用 php 客户端库进行测试。

public function init() 
  $client = new Google_Client();

  if (isset($_SESSION['access_token'])) 
    $client->setAccessToken($_SESSION['access_token']);
  

  $key = file_get_contents(App::SERVICE_KEY_FILE);
  $client->setAssertionCredentials(new Google_AssertionCredentials(
      App::SERVICE_ACCOUNT_NAME,
      App::SERVICE_API_SCOPES,
      $key)
  );

  $client->setClientId(App::SERVICE_CLIENT_ID);
  debug($client, 'CLIENT');

  if ($client->getAccessToken()) 
    $this->access_token = $_SESSION['access_token'] = $client->getAccessToken();
    debug($_SESSION['access_token'], 'TOKEN');
   else 
    debug('NO TOKEN');
  
  $this->client = $client;

如您所见,代码与 Google 示例基本相同。我错过了一个额外的步骤吗?

最后一件事,当我使用 Web 应用程序进行身份验证然后访问我的服务帐户脚本时,服务帐户脚本可以获取 Web 应用程序脚本的会话并推送用户记录检索。这是否意味着 Admin SDK API 明确需要通过 Web 应用身份验证进行用户交互?

【问题讨论】:

【参考方案1】:

我没有使用服务帐户,而是选择使用已安装的应用程序 API 访问。

这颗红宝石实际上帮助我解决了这个问题 - https://github.com/evendis/gmail_cli 我在控制台上玩它,只是按照自述文件中的授权步骤,发现安装的应用程序在做服务器管理应用程序时更简单。

作为新手,我想我错过了刷新令牌在整个过程中发挥的重要作用。通过已安装的应用程序方法帮助我弄清楚了这一点。

我的配置文件现在包含客户端 ID、客户端密码、api 范围、重定向 uri、授权码和刷新令牌;我的初始化代码现在看起来像:

public function init() 
  $client = new Google_Client();

  $client->setClientId(App::CLIENT_ID);
  $client->setClientSecret(App::CLIENT_SECRET);
  $client->setScopes(App::API_SCOPES);
  $client->setRedirectUri(App::REDIRECT_URI);

  if (!$client->getAccessToken()) 
    $client->refreshToken(App::REFRESH_TOKEN);
  
  $this->access_token = $client->getAccessToken();
  $this->client = $client;

【讨论】:

以上是关于Google OAuth2 服务帐户 API 授权的主要内容,如果未能解决你的问题,请参考以下文章

Google Adwords API with OAuth2 如何获取授权用户的电子邮件?

使用服务帐户通过 OAuth 2.0 调用 v3 Google 日历 API 时出现“需要登录”401 未经授权的消息

使用服务帐户 oauth2client.client.CryptoUnavailableError 的 Google API 访问:没有可用的加密库

通过 OAuth 2.0 和私钥(即服务帐户)访问 Google Contacts Api

使用 suds 在 Python 中使用 OAuth2 进行 Google Adwords API 身份验证

Google Sign in API OAuth2 错误:youtube 范围内的“invalid_request”