Oauth 谷歌API';s服务帐户客户端授权服务器到服务器(脱机模拟)错误

Oauth 谷歌API';s服务帐户客户端授权服务器到服务器(脱机模拟)错误,oauth,gmail-api,google-api-php-client,Oauth,Gmail Api,Google Api Php Client,@注意,涉及的服务器流使用google api php客户端测试版 目标是将一封电子邮件“插入”到Google for Work gmail帐户中,地址为注册的电子邮件别名 对于此OAuth工作流,我有: 在已注册的附加域上具有电子邮件别名的Google for Work用户 在console.developers.google.com/api中创建了一个“项目”/ 在项目下创建了“服务帐户” 已启用“域范围访问”帐户 向服务帐户添加了OAuth“客户端”,以及作为JSON字符串下载的凭据 授

@注意,涉及的服务器流使用google api php客户端测试版

目标是将一封电子邮件“插入”到Google for Work gmail帐户中,地址为注册的电子邮件别名

对于此OAuth工作流,我有:

  • 在已注册的附加域上具有电子邮件别名的Google for Work用户
  • 在console.developers.google.com/api中创建了一个“项目”/
  • 在项目下创建了“服务帐户”
  • 已启用“域范围访问”帐户
  • 向服务帐户添加了OAuth“客户端”,以及作为JSON字符串下载的凭据
  • 授权客户在中使用“范围”
  • 授权代码,允许“项目”请求“访问令牌”在用户上执行作用域(需要单独的一次性客户端)
下面的服务器代码试图获取使用上述凭据和访问令牌授权的Google_客户端,同时要求OAuth客户端模拟上述GFW用户。此后,$client可以用来调用诸如Google\u Service\u Gmail之类的服务

当前,返回的
$authCreds
带有['error\u 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);
        }
    }
}

如果使用.json文件,则必须将其用于身份验证:
$client->fetchAccessTokenWithAssertion()

如果使用.json文件,则必须使用该文件进行身份验证:
$client->fetchAccessTokenWithAssertion()

确保在使用身份验证代码获取访问令牌之前设置了授权配置

例如:

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

确保在使用身份验证代码获取访问令牌之前设置了授权配置

例如:

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

我不确定您从哪里获得
CLNT\u GOOGL\u API\u SRVC\u ACCT\u CLIENT\u ACCESS\u code
,但服务帐户/客户端没有身份验证代码。一般来说,这段代码很难理解,但是如果你创建了一个or,你就可以开始了。CLNT_*常量是由db store的框架提供的。它们具有足够的描述性,可以想象这些值。创建一个“服务帐户”,并从您的用户帐户授权客户端,使其显示在这里-如上所述完成。我相信你指的是API的项目。你已经检查过OAuth2.0的服务器对服务器应用程序了吗?您是否正确地遵循了此处的指南?我不确定您从哪里获得
CLNT\u GOOGL\u API\u SRVC\u ACCT\u CLIENT\u ACCESS\u code
,但服务帐户/客户没有身份验证码。一般来说,这段代码很难理解,但是如果你创建了一个or,你就可以开始了。CLNT_*常量是由db store的框架提供的。它们具有足够的描述性,可以想象这些值。创建一个“服务帐户”,并从您的用户帐户授权客户端,使其显示在这里-如上所述完成。我相信你指的是API的项目。你已经检查过OAuth2.0的服务器对服务器应用程序了吗?你正确地遵循了这里的指南吗?