Как вызвать Google Analytics Admin API (для GA4) с помощью клиента OAuth2 в node.js?

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

например

const analyticsAdmin = require('@google-analytics/admin');

async function main() {
  // Instantiates a client using default credentials.
  // TODO(developer): uncomment and use the following line in order to
  //  manually set the path to the service account JSON file instead of
  //  using the value from the GOOGLE_APPLICATION_CREDENTIALS environment
  //  variable.
  // const analyticsAdminClient = new analyticsAdmin.AnalyticsAdminServiceClient(
  //     {keyFilename: "your_key_json_file_path"});
  const analyticsAdminClient = new analyticsAdmin.AnalyticsAdminServiceClient();

  const [accounts] = await analyticsAdminClient.listAccounts();

  console.info('Accounts:');
  accounts.forEach(account => {
    console.info(account);
  });
}

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

Сначала я подумал, что смогу использовать google-api-node-client — аутентификация будет обрабатываться путем создания URL-адреса для перенаправления и танца oauth...

Использование google-api-nodejs-client:

const {google} = require('googleapis');

const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// generate a url that asks permissions for Google Analytics scopes
const scopes = [
        "https://www.googleapis.com/auth/analytics",          // View and manage your Google Analytics data
        "https://www.googleapis.com/auth/analytics.readonly", // View your Google Analytics data
];

const url = oauth2Client.generateAuthUrl({
  access_type: 'offline',
  scope: scopes
});

// redirect to `url` in a popup for the oauth dance

После аутентификации Google перенаправляет на GET /oauthcallback?code = {authorizationCode}, поэтому мы собираем код и получаем токен для выполнения последующих вызовов с поддержкой OAuth2:


// This will provide an object with the access_token and refresh_token.
// Save these somewhere safe so they can be used at a later time.
const {tokens} = await oauth2Client.getToken(code)
oauth2Client.setCredentials(tokens);
// of course we need to handle the refresh token too

Это все прекрасно работает, но можно ли подключить клиент OAuth2 из кода google-api-node-client в код google-analytics-admin?

👉 Похоже, мне нужно как-то вызвать analyticsAdmin.AnalyticsAdminServiceClient() с токеном доступа, который я уже получил, но как?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
164
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Простой ответ здесь: не беспокойтесь о библиотеках Node.js для администратора Google Analytics и данных Google Analytics.

Избавьтесь от посредников и создайте очень простую оболочку, которая напрямую запрашивает REST API. Тогда у вас будет обзор всего процесса, и любые допущенные ошибки будут вашими собственными.

Если вы правильно обрабатываете токен обновления, это, вероятно, все, что вам нужно:

const getResponse = async (url, accessToken, options = {}) => {
  const response = await fetch(url, {
    ...options,
    headers: {
      Authorization: `Bearer ${accessToken}`,
    },
  });
  return response;
};

Я использую Python, но метод может быть похожим. На основе полученного токена необходимо создать объект Credentials:

credentials = google.auth.credentials.Credentials(token=YOUR_TOKEN)

Затем используйте его для создания клиента:

from google.analytics.admin import AnalyticsAdminServiceClient

client = AnalyticsAdminServiceClient(credentials=credentials)
client.list_account_summaries()

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