Доступ к Google My Business API без входа в систему (с использованием служебной учетной записи)

Я хочу получить доступ к местоположениям, связанным с моей учетной записью, и их обзорам, для этого я использую google my business API и у меня есть доступ к нему (он работает на oAuthplayground).

Теперь я хочу получить доступ к API моего бизнеса Google без входа в свою учетную запись, для этого я пытаюсь заставить его работать с учетной записью службы. Но пока не повезло, пожалуйста, совет, как поступить с этим. Я включил пакет G в учетной записи службы, а также попытался предоставить доступ к электронной почте (ID) учетной записи службы для управления моей компанией, но он остается в состоянии " Приглашено", поскольку на самом деле нет способа принять приглашение.

Когда я пытаюсь отправить запрос, используя мою учетную запись в качестве темы.

$client = new Google_Client();
$client->addScope('https://www.googleapis.com/auth/plus.business.manage');
$client->setAuthConfig(dirname(__FILE__) . '/Xyz Review API-service account.json');
$client->setSubject('xyz*****abc@gmail.com');
$business_service_class = new Google_Service_Mybusiness($client);
$result_accounts = $business_service_class->accounts->listAccounts();
echo json_encode($result_accounts);
exit;

Ответ: {"nextPageToken":null}

Если я использую идентификатор учетной записи службы Google в качестве идентификатора электронной почты в теме, я получу следующий ответ.

$client->setSubject('xyz-review-service@xyz-review-api.iam.gserviceaccount.com');

Ответ: Ошибка 500 { "error": "unauthorized_client", "error_description": "Неавторизованный клиент или область в запросе". }

Если я делаю это совершенно неправильно, пожалуйста, дайте совет, как поступить с этим. Спасибо.

3 ответа

Вот что у меня получилось в 2021 году, работая с NodeJS:

Чтобы войти в систему в качестве учетной записи службы для проверки подлинности сервера на сервер, вам необходимо включить делегирование домена для своей учетной записи службы. https://developers.google.com/admin-sdk/directory/v1/guides/delegation

Как только вы это сделаете, вы можете сделать вход в свой сервисный аккаунт в Google My Business API, выдав себя за адрес электронной почты утвержденного менеджера My Business. Это в NodeJS, вот что я использовал:

      const { google } = require('googleapis'); // MAKE SURE TO USE GOOGLE API
const { default: axios } = require('axios'); //using this for api calls

const key = require('./serviceaccount.json'); // reference to your service account
const scopes = 'https://www.googleapis.com/auth/business.manage'; // can be an array of scopes

const jwt = new google.auth.JWT({
  email: key.client_email,
  key: key.private_key,
  scopes: scopes,
  subject: `impersonated@email.com`
});

async function getAxios() {

  const response = await jwt.authorize() // authorize key
  let token = response.access_token // dereference token
  console.log(response)

    await axios.get('https://mybusiness.googleapis.com/v4/accounts', {
      headers: {
        Authorization: `Bearer ${token}`
      } // make request
    })
    .then((res) => { // handle response
      console.log(res.data);
    })
    .catch((err) => { // handle error
      console.log(err.response.data);
    })
  }

await getAxios(); // call the function

Я столкнулся с проблемой аутентификации для моего внутреннего сервиса с Google Apis. В основном существует два метода:

  1. создайте страницу, чтобы принять ваше приложение для доступа к учетной записи Google
  2. создать сертификат для аутентификации приложения с "неявным" утверждением

Как я уже сказал, я использую API Google для внутреннего проекта, поэтому первый вариант не подлежит обсуждению (сервис не является публичным). Перейдите на https://console.cloud.google.com/ и создайте новый проект, затем перейдите в "api manager", затем "учетные данные", затем создайте "учетные данные службы".

Если вы выполните все эти шаги, у вас есть сертификат с расширением.p12, это ваш ключ для доступа к API Google (помните, что вы должны включить ключ для доступа к конкретному API Google, который вы хотите).

Я вставляю пример, извлеченный из моего проекта, я использую календарь Google, но аутентификация одинакова для каждой службы.

   $client_email = 'xxxx@developer.gserviceaccount.com';
    $private_key = file_get_contents(__DIR__ . '/../Resources/config/xxxx.p12');
    $scopes = array('https://www.googleapis.com/auth/calendar');
    $credentials = new \Google_Auth_AssertionCredentials(
        $client_email,
        $scopes,
        $private_key
    );

    $this->client = new \Google_Client();
    $this->client->setAssertionCredentials($credentials);  

Пытаюсь запустить код Node.JS от Джулиана, но получаю ошибки от jwt.authorize() функция:

Error: unauthorized_client: Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.

Не знаю, как это исправить.

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