Правильный способ получения токена доступа к серверу для клиента для использования с аналитикой google

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

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

Ответ 1

Здесь приведен пример настройки аутентификации на стороне сервера. Вышеприведенный код создает новый токен, когда кто-либо посещает сайт. Вы можете увидеть конечную точку, которая получает этот токен доступа здесь.

Ниже приведены общие шаги для перехода к рабочей версии:

Шаг 1. Создайте учетную запись службы и загрузите ключ JSON.

Шаг 2. Добавьте учетную запись службы в качестве пользователя в Google Analytics.

Шаг 3. Используйте данные ключа JSON для запроса токена доступа.

# service-account.py

import json
from oauth2client.client import SignedJwtAssertionCredentials

# The scope for the OAuth2 request.
SCOPE = 'https://www.googleapis.com/auth/analytics.readonly'

# The location of the key file with the key data.
KEY_FILEPATH = 'path/to/json-key.json'

# Load the key file private data.
with open(KEY_FILEPATH) as key_file:
  _key_data = json.load(key_file)

# Construct a credentials objects from the key data and OAuth2 scope.
_credentials = SignedJwtAssertionCredentials(
    _key_data['client_email'], _key_data['private_key'], SCOPE)

# Defines a method to get an access token from the credentials object.
# The access token is automatically refreshed if it has expired.
def get_access_token():
  return _credentials.get_access_token().access_token

Вернитесь на сторону клиента:

Шаг 4. Загрузите библиотеку Embed API.

<script>
(function(w,d,s,g,js,fs){
  g=w.gapi||(w.gapi={});g.analytics={q:[],ready:function(f){this.q.push(f);}};
  js=d.createElement(s);fs=d.getElementsByTagName(s)[0];
  js.src='https://apis.google.com/js/platform.js';
  fs.parentNode.insertBefore(js,fs);js.onload=function(){g.load('analytics');};
}(window,document,'script'));
</script>

Шаг 5. Добавьте контейнеры HTML для размещения компонентов панели инструментов.

<div id="chart-1-container"></div>
<div id="chart-2-container"></div>

Шаг 6. Введите код панели управления.

Использовать токен доступа, полученный на шаге 3, для авторизации API-интерфейса.

gapi.analytics.ready(function() {

  /**
   * Authorize the user with an access token obtained server side.
   */
  gapi.analytics.auth.authorize({
    'serverAuth': {
      'access_token': '{{ ACCESS_TOKEN_FROM_SERVICE_ACCOUNT }}'
    }
  });
  ...

Дополнительная работа по созданию конечной точки, которая возвращает токен, зависит от вашей конечной реализации, но исходный код того, как эта демонстрация может быть найдена здесь.

Ответ 2

Я не очень хорошо знаком с Google Analytics, но насколько OAuth идет, обработка токенов доступа и токенов обновления должна быть на стороне сервера. Клиент получает код авторизации и предоставляет это серверу, который затем получает токены и использует токены для получения необходимых данных. Не нужно отправлять маркер доступа клиенту.

Возможно, было бы полезно прочитать это, в котором описывается стандартный поток OAuth: https://developers.google.com/identity/protocols/OAuth2