2016-08-24 3 views
0

@note Вовлеченному поток сервера использует Google-API-PHP-клиент-бетаGoogle API,

Цель состоит в том, чтобы «вставки» сообщение по электронной почте» 'в учетную запись gmail для Google for Work, адресованную зарегистрированному псевдониму электронной почты.

Для этого OAuth процесса, у меня есть:

  • Google для работы пользователя с псевдонимом электронной почты на зарегистрированном дополнительный домене
  • создал «Project» в console.developers.google.com/APIs/
  • создала «учетную запись службы» в рамках проекта
  • включен счет для «общедоменного-доступа»
  • добавил «клиент» не давала OAuth для учетной записи службы, а также с учетными данными загруженными как JSON строка
  • уполномочил Клиент «прицелами» в https://admin.google.com/my-domain.tld
  • код авторизации позволяет «Project» просить «Access Лексема», чтобы сделать области на пользователе (требует отдельного одноразового клиента)

следующий код сервера пытается получить Google_Client, авторизованный с вышеупомянутыми учетными данными и токеном доступа, при этом просит OAuth Client выдать себя за упомянутого пользователя GFW. После этого клиент $ можно использовать для вызова таких сервисов, как Google_Service_Gmail.

В настоящее время $authCreds возвращается с [ «error_description»] => «Не удалось определить идентификатор клиента из запроса» сообщение об ошибке

// local const's for testing 
const CLNT_GOOGL_SRVC_ACCT_CREDS = ''; 
const CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE = ''; 
/** 
* Returns an authorized API client. 
* @return Google_Client the authorized client object 
*/ 
private static function getAuthorizedClient() { 
    $client = new Google_Client(); 
    $isSrvcAcct = false; 

    if (self::CLNT_GOOGL_SRVC_ACCT_CREDS) { 
     $isSrvcAcct = true; 
     $creds = json_decode(self::CLNT_GOOGL_SRVC_ACCT_CREDS, true); 
    } elseif (defined('CLNT_GOOGL_SRVC_ACCT_CREDS')) { 
     $isSrvcAcct = true; 
     $creds = json_decode(CLNT_GOOGL_SRVC_ACCT_CREDS, true); 
    } 

    if ($isSrvcAcct) { 
     if (! isset($creds)) { 
      acapApp::catchProcessMessage('CLNT_GOOGL_SRVC_ACCT_CREDS is not valid JSON?', ACAP_DEBUG); 

      return; 
     } 

     self::setServiceClient($client, (array) $creds); 
    } else { 
     self::setUserClient($client); 
    } 

    if ($client->getAccessToken()) { 
     return $client; 
    } 
} 

private static function setServiceClient(Google_Client $client, array $creds) { 
    $client->setAuthConfig($creds); 
    $client->setSubject(CLNT_SMTP_OAUTH_USER_EMAIL); 

    if (self::CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE) { 
     $authCode = self::CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE; 
    } else if (defined('CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE')) { 
     $authCode = CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE; 
    } 

    if (isset($authCode)) { 
     $authCreds = $client->fetchAccessTokenWithAuthCode($authCode); 
     if (isset($authCreds['error'])) { 
      acapApp::catchProcessMessage('Failure Fetching Auth Token: '.$authCreds['error_description'], ACAP_DEBUG); 
     } 
    } 
} 
+0

Я не уверен, где вы получаете 'CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE', но обслуживание счетов/клиенты не имеют AUTH коды. Только пользователи. –

+0

В целом этот код очень сложно выполнить, но если вы создаете [установленное приложение] (https://developers.google.com/identity/protocols/OAuth2InstalledApp) или [делегируете пользовательский пароль для учетной записи службы] (https: //github.com/google/google-api-php-client/issues/801#issuecomment-171417538), вам будет хорошо. –

+0

Константы CLNT_ * предоставляются каркасом из хранилища db. Они достаточно понятны, чтобы представить себе ценности. – CNSKnight

ответ

1

Если вы используете файл .json и есть, чтобы использовать эту функцию для идентификации: $ client-> fetchAccessTokenWithAssertion()

1

Убедитесь, что вы устанавливаете конфигурации авторизации перед для извлечения маркеров доступа с кодом AUTH.

Например:

<?php 
$client->setAuthConfig(storage_path('app/google_client_id.json')); 
$token = $client->fetchAccessTokenWithAuthCode($code);