Для поддержки неявного потока OAuth 2.0 ваш сервис предоставляет конечную точку авторизации по протоколу HTTPS. Эта конечная точка отвечает за аутентификацию и получение согласия пользователей на доступ к данным. Конечная точка авторизации отображает пользователям, которые еще не авторизованы, интерфейс входа в систему и регистрирует согласие на запрошенный доступ.
Когда приложению Google необходимо вызвать один из авторизованных API вашего сервиса, Google использует эту конечную точку, чтобы получить разрешение от ваших пользователей на вызов этих API от их имени.
Привязка учетной записи Google: неявный поток OAuth.
На приведенной ниже диаграмме подробно описаны взаимодействия между пользователем, Google и конечными точками вашего сервиса.
Роли и обязанности
В таблице ниже определены роли и обязанности участников процесса неявной аутентификации OAuth через Google Account Linking (GAL). Обратите внимание, что в GAL Google выступает в роли клиента OAuth, а ваш сервис — в роли поставщика идентификации/услуг .
| Актер / Компонент | Роль GAL | Обязанности |
|---|---|---|
| Приложение/сервер Google | Клиент OAuth | Запускает процесс, получает токен доступа посредством перенаправления в браузере и безопасно сохраняет его для доступа к API вашего сервиса. |
| Ваша точка авторизации | Сервер авторизации | Аутентифицирует ваших пользователей, получает их согласие и выдает Google токены доступа с длительным сроком действия. |
| URI перенаправления Google | Конечная точка обратного вызова | Получает перенаправление пользователя от вашей службы авторизации со значениями access_token и state во фрагменте URL. |
Типичная сессия неявного потока OAuth 2.0, инициированная Google, имеет следующий характер:
- Google открывает вашу точку авторизации в браузере пользователя. Пользователь входит в систему, если он еще не вошел, и предоставляет Google разрешение на доступ к своим данным через ваш API, если он еще не предоставил такое разрешение.
- Ваш сервис создает токен доступа и возвращает его в Google. Для этого перенаправьте браузер пользователя обратно на сайт Google, прикрепив токен доступа к запросу.
- Google обращается к API вашего сервиса и прикрепляет токен доступа к каждому запросу. Ваш сервис проверяет, предоставляет ли токен доступа Google разрешение на доступ к API, а затем завершает вызов API.
Рецепт реализации
Выполните следующие шаги для реализации неявного потока.
Шаг 1: Обработка запросов на авторизацию
Когда Google инициирует привязку учетной записи, он перенаправляет пользователя на вашу конечную точку авторизации. Подробные сведения о протоколах и требованиях к параметрам см. в разделе « Конечная точка авторизации» .
Для обработки запроса выполните следующие действия:
Подтвердите запрос :
- Убедитесь, что
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.
- Убедитесь, что
Аутентификация пользователя :
- Проверьте, вошел ли пользователь в вашу систему.
- Если пользователь не авторизован, предложите ему пройти процедуру входа или регистрации.
Сгенерируйте токен доступа :
- Создайте уникальный, не поддающийся угадыванию токен доступа, связанный с пользователем и клиентом.
Перенаправить обратно на Google :
- Перенаправьте браузер на URL-адрес, указанный в
redirect_uri. - Добавьте следующие параметры в фрагмент URL (хеш):
-
access_token: Сгенерированный вами токен доступа. -
token_type: Должен бытьbearer. -
state: Неизмененное значение состояния, полученное от Google.
-
- Перенаправьте браузер на URL-адрес, указанный в
Обработка запросов информации о пользователях
Конечная точка userinfo — это ресурс, защищенный OAuth 2.0, который возвращает утверждения о связанном пользователе. Реализация и размещение конечной точки userinfo не является обязательной, за исключением следующих случаев использования:
- Вход в связанную учетную запись с помощью Google One Tap.
- Простая подписка на AndroidTV.
После того как токен доступа был успешно получен из конечной точки вашего токена, 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 могла обрабатывать запросы, выполните следующие действия:
- Извлеките токен доступа из заголовка авторизации и верните информацию для пользователя, связанного с токеном доступа.
- Если токен доступа недействителен, верните ошибку HTTP 401 Unauthorized с использованием заголовка ответа
WWW-Authenticate. Ниже приведен пример ответа об ошибке с информацией о пользователе: Если в процессе связывания возвращается ошибка 401 Unauthorized или любой другой неудачный ответ об ошибке, ошибка будет невосстановимой, полученный токен будет отброшен, и пользователю придется снова инициировать процесс связывания.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
Если токен доступа действителен, верните ответ HTTP 200 со следующим объектом JSON в теле ответа HTTPS:
Если ваша конечная точка userinfo возвращает успешный ответ HTTP 200, полученный токен и утверждения регистрируются в учетной записи Google пользователя.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }ответ конечной точки с информацией о пользователе subУникальный идентификатор, идентифицирующий пользователя в вашей системе. emailАдрес электронной почты пользователя. given_nameНеобязательно: Имя пользователя. family_nameНеобязательно: фамилия пользователя. nameНеобязательно: Полное имя пользователя. pictureНеобязательно: изображение профиля пользователя.