Oauth 谷歌API';s服务帐户客户端授权服务器到服务器(脱机模拟)错误
@注意,涉及的服务器流使用google api php客户端测试版 目标是将一封电子邮件“插入”到Google for Work gmail帐户中,地址为注册的电子邮件别名 对于此OAuth工作流,我有: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 for Work用户
- 在console.developers.google.com/api中创建了一个“项目”/
- 在项目下创建了“服务帐户”
- 已启用“域范围访问”帐户
- 向服务帐户添加了OAuth“客户端”,以及作为JSON字符串下载的凭据
- 授权客户在中使用“范围”
- 授权代码,允许“项目”请求“访问令牌”在用户上执行作用域(需要单独的一次性客户端)
$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的服务器对服务器应用程序了吗?你正确地遵循了这里的指南吗?