2016-08-24 107 views
0

@note的參與服務器流使用谷歌的API的PHP客戶端-β谷歌API的服務帳戶客戶授權服務器到服務器(離線模擬)錯誤

的目標是「插入」電子郵件「消息'轉換爲Google for Work Gmail帳戶,並註冊到註冊的電子郵件別名。

對於這個OAuth的認證流程,我有:

  • 一個對谷歌與電子郵件別名工作用戶的註冊附加域
  • 在console.developers.google.com創造了一個「項目」 /的API/
  • 創建「服務帳戶」項目
  • 下啓用帳戶「域範圍內的訪問」
  • 添加了OAuth的「客戶」的服務帳戶,以下載爲JSON憑據一起串
  • 授權與「範圍」客戶端在https://admin.google.com/my-domain.tld
  • 授權碼允許「工程」到請求的訪問令牌'做在用戶範圍(需要單獨的單次使用的客戶端)

的服務器代碼嘗試獲取授權上述憑證和訪問令牌的Google_Client,同時要求OAuth客戶端模擬所述的GFW用戶。此後,可以使用$ client來調用服務,例如Google_Service_Gmail。

目前,$authCreds[ 'ERROR_DESCRIPTION'] =>返回 '無法確定從請求客戶端ID'錯誤消息

// 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',但服務帳戶/客戶端沒有身份驗證碼。只有用戶可以。 –

+0

通常,此代碼很難遵循,但如果您創建[安裝的應用程序](https://developers.google.com/identity/protocols/OAuth2InstalledApp)或[將用戶身份驗證委託給服務帳戶](https: //github.com/google/google-api-php-client/issues/801#issuecomment-171417538),那麼您將很好。 –

+0

CLNT_ *常量由db store中的框架提供。它們足以描述其價值。 – CNSKnight

回答

1

如果使用以.json文件u必須使用此面向auth: $客戶 - > fetchAccessTokenWithAssertion()

1

確保你的授權配置之前設置爲獲取與授權碼的訪問令牌。

例如:

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