Связывание учетной записи Google с OAuth (неявный поток — архив)

Для поддержки неявного потока OAuth 2.0 ваш сервис предоставляет конечную точку авторизации по протоколу HTTPS. Эта конечная точка отвечает за аутентификацию и получение согласия пользователей на доступ к данным. Конечная точка авторизации отображает пользователям, которые еще не авторизованы, интерфейс входа в систему и регистрирует согласие на запрошенный доступ.

Когда приложению Google необходимо вызвать один из авторизованных API вашего сервиса, Google использует эту конечную точку, чтобы получить разрешение от ваших пользователей на вызов этих API от их имени.

Привязка учетной записи Google: неявный поток OAuth.

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

Пользователь Приложение Google / Браузер Ваша авторизация Конечная точка 1. Пользователь инициирует создание ссылки. 2. Перенаправление на конечную точку аутентификации (GET) client_id, redirect_uri, state, scope 3. Отобразить экран входа в систему и согласия. 4. Пользователь проходит аутентификацию и дает согласие. 5. Перенаправление обратно на Google с использованием токена (GET) access_token, state 6. Хранение пользовательских токенов 7. Доступ к пользовательским ресурсам
Рисунок 1. Последовательность событий в неявном потоке OAuth 2.0 для привязки учетной записи Google.

Роли и обязанности

В таблице ниже определены роли и обязанности участников процесса неявной аутентификации OAuth через Google Account Linking (GAL). Обратите внимание, что в GAL Google выступает в роли клиента OAuth, а ваш сервис — в роли поставщика идентификации/услуг .

Актер / Компонент Роль GAL Обязанности
Приложение/сервер Google Клиент OAuth Запускает процесс, получает токен доступа посредством перенаправления в браузере и безопасно сохраняет его для доступа к API вашего сервиса.
Ваша точка авторизации Сервер авторизации Аутентифицирует ваших пользователей, получает их согласие и выдает Google токены доступа с длительным сроком действия.
URI перенаправления Google Конечная точка обратного вызова Получает перенаправление пользователя от вашей службы авторизации со значениями access_token и state во фрагменте URL.

Типичная сессия неявного потока OAuth 2.0, инициированная Google, имеет следующий характер:

  1. Google открывает вашу точку авторизации в браузере пользователя. Пользователь входит в систему, если он еще не вошел, и предоставляет Google разрешение на доступ к своим данным через ваш API, если он еще не предоставил такое разрешение.
  2. Ваш сервис создает токен доступа и возвращает его в Google. Для этого перенаправьте браузер пользователя обратно на сайт Google, прикрепив токен доступа к запросу.
  3. Google обращается к API вашего сервиса и прикрепляет токен доступа к каждому запросу. Ваш сервис проверяет, предоставляет ли токен доступа Google разрешение на доступ к API, а затем завершает вызов API.

Рецепт реализации

Выполните следующие шаги для реализации неявного потока.

Шаг 1: Обработка запросов на авторизацию

Когда Google инициирует привязку учетной записи, он перенаправляет пользователя на вашу конечную точку авторизации. Подробные сведения о протоколах и требованиях к параметрам см. в разделе « Конечная точка авторизации» .

Для обработки запроса выполните следующие действия:

  1. Подтвердите запрос :

    • Убедитесь, что client_id совпадает с идентификатором клиента, присвоенным Google.
    • Убедитесь, что redirect_uri соответствует ожидаемому URL-адресу перенаправления Google: none https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
    • Убедитесь, что response_type имеет token .
  2. Аутентификация пользователя :

    • Проверьте, вошел ли пользователь в вашу систему.
    • Если пользователь не авторизован, предложите ему пройти процедуру входа или регистрации.
  3. Сгенерируйте токен доступа :

    • Создайте уникальный, не поддающийся угадыванию токен доступа, связанный с пользователем и клиентом.
  4. Перенаправить обратно на Google :

    • Перенаправьте браузер на URL-адрес, указанный в redirect_uri .
    • Добавьте следующие параметры в фрагмент URL (хеш):
      • access_token : Сгенерированный вами токен доступа.
      • token_type : Должен быть bearer .
      • state : Неизмененное значение состояния, полученное от Google.
Обработка запросов информации о пользователях

Конечная точка userinfo — это ресурс, защищенный OAuth 2.0, который возвращает утверждения о связанном пользователе. Реализация и размещение конечной точки userinfo не является обязательной, за исключением следующих случаев использования:

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

заголовки запроса конечной точки userinfo
Authorization header Токен доступа типа Bearer.

Например, если ваша конечная точка userinfo доступна по адресу https://myservice.example.com/userinfo , запрос может выглядеть следующим образом:

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

Чтобы ваша конечная точка userinfo могла обрабатывать запросы, выполните следующие действия:

  1. Извлеките токен доступа из заголовка авторизации и верните информацию для пользователя, связанного с токеном доступа.
  2. Если токен доступа недействителен, верните ошибку HTTP 401 Unauthorized с использованием заголовка ответа WWW-Authenticate . Ниже приведен пример ответа об ошибке с информацией о пользователе:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    Если в процессе связывания возвращается ошибка 401 Unauthorized или любой другой неудачный ответ об ошибке, ошибка будет невосстановимой, полученный токен будет отброшен, и пользователю придется снова инициировать процесс связывания.
  3. Если токен доступа действителен, верните ответ HTTP 200 со следующим объектом JSON в теле ответа HTTPS:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    Если ваша конечная точка userinfo возвращает успешный ответ HTTP 200, полученный токен и утверждения регистрируются в учетной записи Google пользователя.

    ответ конечной точки с информацией о пользователе
    sub Уникальный идентификатор, идентифицирующий пользователя в вашей системе.
    email Адрес электронной почты пользователя.
    given_name Необязательно: Имя пользователя.
    family_name Необязательно: фамилия пользователя.
    name Необязательно: Полное имя пользователя.
    picture Необязательно: изображение профиля пользователя.