使用 Google Oauth2 凭据“服务帐户”模拟用户 EMAIL ID
Impersonate the user EMAIL ID using Google Oauth2 Credentials ‘Service Account’
我正在尝试使用来自 PHP GAE 的 Google Api OAuth 服务帐户创建 Google 日历事件。
我需要正确的会话 ID 或日历事件字段中的 用户电子邮件 ID '创建者' 。
这在 Google Apps Script(GAS) 中很有可能,它会创建具有正确会话 ID 的事件。
但是,我希望在 PHP GAE(Google App Engine) 中完成相同的操作。因此,我尝试如下冒充用户 ID:Perform Google Apps Domain-Wide Delegation of Authority
我的目标是自动插入任何最终用户的正确用户 ID,就像在 GAS(Google Apps Script) 中一样。 我不想在“创建者”字段中设置任何默认凭据..
使用 PHP 客户端库 我试图在日历中模拟用户 API.I 没有得到任何完整的日历示例 API.So, 我尝试了 Drive API 文档 sample,这个示例似乎工作正常,也使用其他域用户
使用日历 API 我写了下面的例子。
<?php
require_once realpath(dirname(__FILE__).'/google-api-php-client-master/src/Google/autoload.php');
require_once realpath(dirname(__FILE__).'/google-api-php-client-master/src/Google/Service/Calendar.php');
require_once realpath(dirname(__FILE__).'/google-api-php-client-master/src/Google/Service/Oauth2.php');
use google\appengine\api\users\User;
use google\appengine\api\users\UserService;
$user = UserService::getCurrentUser();
$userEmail=$user->getEmail();
$client_email = '34234242424-qssjf8kg1kk42dnjdvd2ndrk7rou44@developer.gserviceaccount.com';
$private_key = file_get_contents('key.p12');
$scopes = array('https://www.googleapis.com/auth/calendar');
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key
);
$credentials->sub = $userEmail;
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
$service =new Google_Service_Calendar($client);
$event = new Google_Service_Calendar_Event();
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime('2015-09-26T10:00:00.000-07:00');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime('2015-09-26T10:00:00.000-07:00');
$event->setEnd($end);
$createdEvent = $service->events->insert('abc@group.calendar.google.com', $event);
当我查看这封电子邮件时它运行良好,我获得了正确的服务帐户凭据。
但是当我使用不同的电子邮件 ID 时,出现以下错误
PHP Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Error refreshing the OAuth2 token, message: '{ "error" : "unauthorized_client", "error_description" : "Unauthorized client or scope in request." }'' in /base/data/home/apps/s~production/1.3874/google-api-php-client-master/src/Google/Auth/OAuth2.php:363 Stack trace: #0 /base/data/home/apps/s~production/1.387/google-api-php-client-master/src/Google/Auth/OAuth2.php(314): Google_Auth_OAuth2->refreshTokenRequest(Array) #1 /base/data/home/apps/s~ei-html-production/1.3874/final.php(34): Google_Auth_OAuth2->refreshTokenWithAssertion() #2 {main} thrown in /base/data/home/apps/s~production/1.38742/google-api-php-client-master/src/Google/Auth/OAuth2.php on line 363
请帮我做一下 wrong.Why 问题发生了,当我使用差异电子邮件 ID 时,我的最终用户将创建校准事件,可以是任何基于 GMAIL 或 Google 的域 ID .
所以,请至少提供一个示例部分...
参考链接:
How do I Insert Google Calendar Event using Google Api 3 for any user in the domain?
How to create a Google Calendar event without a reminder / How to get Service Accounts to impersonate users
您只能在您拥有必要权限的 google 应用程序域中模拟用户(搜索 'domain wide delegation')。你已经知道了。
一旦您获得模拟授权,您必须为您模拟的每个用户重新创建一个新的 Google 客户端。您只会收到可用于该用户的 access_token。如果您只是在获得授权后更改电子邮件地址,它将不起作用。
我正在尝试使用来自 PHP GAE 的 Google Api OAuth 服务帐户创建 Google 日历事件。
我需要正确的会话 ID 或日历事件字段中的 用户电子邮件 ID '创建者' 。 这在 Google Apps Script(GAS) 中很有可能,它会创建具有正确会话 ID 的事件。
但是,我希望在 PHP GAE(Google App Engine) 中完成相同的操作。因此,我尝试如下冒充用户 ID:Perform Google Apps Domain-Wide Delegation of Authority
我的目标是自动插入任何最终用户的正确用户 ID,就像在 GAS(Google Apps Script) 中一样。 我不想在“创建者”字段中设置任何默认凭据..
使用 PHP 客户端库 我试图在日历中模拟用户 API.I 没有得到任何完整的日历示例 API.So, 我尝试了 Drive API 文档 sample,这个示例似乎工作正常,也使用其他域用户
使用日历 API 我写了下面的例子。
<?php
require_once realpath(dirname(__FILE__).'/google-api-php-client-master/src/Google/autoload.php');
require_once realpath(dirname(__FILE__).'/google-api-php-client-master/src/Google/Service/Calendar.php');
require_once realpath(dirname(__FILE__).'/google-api-php-client-master/src/Google/Service/Oauth2.php');
use google\appengine\api\users\User;
use google\appengine\api\users\UserService;
$user = UserService::getCurrentUser();
$userEmail=$user->getEmail();
$client_email = '34234242424-qssjf8kg1kk42dnjdvd2ndrk7rou44@developer.gserviceaccount.com';
$private_key = file_get_contents('key.p12');
$scopes = array('https://www.googleapis.com/auth/calendar');
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key
);
$credentials->sub = $userEmail;
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
$service =new Google_Service_Calendar($client);
$event = new Google_Service_Calendar_Event();
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime('2015-09-26T10:00:00.000-07:00');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime('2015-09-26T10:00:00.000-07:00');
$event->setEnd($end);
$createdEvent = $service->events->insert('abc@group.calendar.google.com', $event);
当我查看这封电子邮件时它运行良好,我获得了正确的服务帐户凭据。 但是当我使用不同的电子邮件 ID 时,出现以下错误
PHP Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Error refreshing the OAuth2 token, message: '{ "error" : "unauthorized_client", "error_description" : "Unauthorized client or scope in request." }'' in /base/data/home/apps/s~production/1.3874/google-api-php-client-master/src/Google/Auth/OAuth2.php:363 Stack trace: #0 /base/data/home/apps/s~production/1.387/google-api-php-client-master/src/Google/Auth/OAuth2.php(314): Google_Auth_OAuth2->refreshTokenRequest(Array) #1 /base/data/home/apps/s~ei-html-production/1.3874/final.php(34): Google_Auth_OAuth2->refreshTokenWithAssertion() #2 {main} thrown in /base/data/home/apps/s~production/1.38742/google-api-php-client-master/src/Google/Auth/OAuth2.php on line 363
请帮我做一下 wrong.Why 问题发生了,当我使用差异电子邮件 ID 时,我的最终用户将创建校准事件,可以是任何基于 GMAIL 或 Google 的域 ID .
所以,请至少提供一个示例部分...
参考链接:
How do I Insert Google Calendar Event using Google Api 3 for any user in the domain?
How to create a Google Calendar event without a reminder / How to get Service Accounts to impersonate users
您只能在您拥有必要权限的 google 应用程序域中模拟用户(搜索 'domain wide delegation')。你已经知道了。
一旦您获得模拟授权,您必须为您模拟的每个用户重新创建一个新的 Google 客户端。您只会收到可用于该用户的 access_token。如果您只是在获得授权后更改电子邮件地址,它将不起作用。