Обновить подпись пользователя в моем домене 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 vivien@mydomain.com"
   }
  ],
  "code": 403,
  "message": "Delegation denied for vivien@mydomain.com"
 }
}

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

Вот мой код теста 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('vivien@mydomain.com');
    $httpClient = $client->authorize();

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

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

1 ответ

Вы должны пройти аутентификацию в 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 с идентификатором пользователя (mail-адрес) учетной записи, с которой следует отправлять почту.:

$results = $service->users_messages->send("senders_mail@domain.com", $msg);

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

$cred->sub = 'senders_mail@domain.com';
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();
}

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

Другие вопросы по тегам