Обновить подпись пользователя в моем домене G suite

Моя цель — обновить подпись электронной почты всех пользователей с моего домена.

Я создал служебную учетную запись с полномочиями делегирования на уровне домена.
Но я застрял с этой ошибкой:

{
"error": {
"errors": [
{\n
"domain": "global",
"reason": "failedPrecondition",
"message": "Bad Request"}
],
"code": 400,
"message": "Bad Request"}
}

Я использую тот же запрос, что и тот, который был выполнен в проводнике API. Так что должно быть хорошо отформатировано …

В проводнике API он тоже не работает должным образом, у меня есть такой ответ:

{
"error": {
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "Delegation denied for [email protected]"}
],
"code": 403,
"message": "Delegation denied for [email protected]"}
}

Кажется, у меня проблемы с разрешением, но я не могу понять, почему.

Вот мой код теста PHP для информации:

 public function updateSignAction(){

putenv('GOOGLE_APPLICATION_CREDENTIALS='.$this->get('kernel')->getRootDir().'/../app/Resources/files/mydomain.json');

$client = new \Google_Client();
$client->useApplicationDefaultCredentials();
$client->setApplicationName("demo");
$client->addScope([
"https://www.googleapis.com/auth/gmail.settings.basic",
"https://www.googleapis.com/auth/gmail.settings.sharing"]);
//$client->setSubject('[email protected]');
$httpClient = $client->authorize();

$response = $httpClient->put(
'https://www.googleapis.com/gmail/v1/users/[email protected]/settings/sendAs/test',
[
'json' => [
'signature' => "test-via-api"]
]
);

return $this->render('AdminBundle:GoogleApi:user/update.html.twig', array(
'response' => $response->getBody()->getContents(),
));
}

0

Решение

Вы должны пройти аутентификацию в API. Для этого есть два способа:

  • Использовать OAuth — сервер перенаправляет пользователей на серверы Google, где они могут войти в систему, предоставить разрешение вашему приложению и передать вам токен
  • Сервис Аккаунтов. Это немного сложнее:
  • Во-первых, вам нужно настроить приложение (готово)
  • Во-вторых, вам придется настроить учетную запись службы. Вот как ваше приложение аутентифицируется в Google. Вы сделали это, и сертификат, который вы получили, содержит закрытый ключ для аутентификации
  • В-третьих, пользователь должен предоставить вашему приложению доступ к действиям от их имени. Это точка, которую вы еще не сделали.

Итак, в настоящее время вы пытаетесь отправить почту с учетной записи службы, но это не учетная запись Gmail.

Обратите внимание: с обычными учетными записями GMail вы не можете использовать «служебные учетные записи». Вам придется использовать OAuth. Чтобы использовать учетные записи служб, вы должны быть клиентом Служб Google.

Чтобы предоставить вашей учетной записи службы разрешения на отправку писем от имени ваших учетных записей GMails / Google Apps, выполните следующие действия. этот документ. Для одной или нескольких областей API вам нужно будет ввести https://mail.google.com/,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.compose,https://www.googleapis.com/auth/gmail.send,

После настройки можно отправлять письма, просто изменив код следующим образом:

$results = $service->users_messages->send("me", $msg);

не будет работать, потому что «я» ссылается на учетную запись службы, которая не может отправлять почту (см. выше). замещать me с идентификатором пользователя (почтовым адресом) учетной записи, с которой следует отправлять почту .:

$results = $service->users_messages->send("[email protected]", $msg);

Затем вам нужно будет добавить

$cred->sub = '[email protected]';
below

$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose'),
$key
);

<?php
require_once realpath(dirname(__FILE__) . '/../src/Google/autoload.php');
$client_id = '*censored*.apps.googleusercontent.com';
$service_account_name = '*censored*@developer.gserviceaccount.com';
$key_file_location = '/tmp/apiKey.p12';

$userid_from='*censored*';
$client = new \Google_Client();
$client->setApplicationName("Client_Library_Examples");

if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}

$key = file_get_contents($key_file_location);
$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose', 'https://www.googleapis.com/auth/gmail.modify','https://www.googleapis.com/auth/gmail.readonly'),
$key
);
$cred->sub=$userid_from;
$client->setAssertionCredentials($cred);

if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}

$mime = "*censored*";

$service = new \Google_Service_Gmail($client);

$msg = new \Google_Service_Gmail_Message();
$msg->setRaw($mime);

try {
$results = $service->users_messages->send($userid_from, $msg);
print 'Message with ID: ' . $results->id . ' sent.';
} catch (\Exception $e) {
print 'An error occurred: ' . $e->getMessage();
}

Если остались какие-либо вопросы, не стесняйтесь задавать!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]