@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);
}
}
}
我不知道你在哪裏得到'CLNT_GOOGL_API_SRVC_ACCT_CLIENT_ACCESS_CODE',但服務帳戶/客戶端沒有身份驗證碼。只有用戶可以。 –
通常,此代碼很難遵循,但如果您創建[安裝的應用程序](https://developers.google.com/identity/protocols/OAuth2InstalledApp)或[將用戶身份驗證委託給服務帳戶](https: //github.com/google/google-api-php-client/issues/801#issuecomment-171417538),那麼您將很好。 –
CLNT_ *常量由db store中的框架提供。它們足以描述其價值。 – CNSKnight