Вход в связанный аккаунт

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

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

Требования

Чтобы реализовать вход в связанную учетную запись, вы должны выполнить следующие требования:

  • У вас есть реализация связывания OAuth аккаунта Google , которая поддерживает поток кода авторизации OAuth 2.0. Ваша реализация OAuth должна включать следующие конечные точки:
  • У вас есть приложение для Android.

Как это работает

Предварительное условие: пользователь ранее связал свою учетную запись Google со своей учетной записью в вашем сервисе.

  1. Вы соглашаетесь на отображение связанных учетных записей во время входа в систему в одно касание.
  2. Пользователю отображается приглашение на вход в одно касание с возможностью войти в вашу службу с помощью связанной учетной записи.
  3. Если пользователь решает продолжить работу со связанной учетной записью, Google отправляет запрос на конечную точку вашего токена, чтобы сохранить код авторизации. Запрос содержит токен доступа пользователя, выданный вашим сервисом, и код авторизации Google.
  4. Вы обмениваете код авторизации Google на токен Google ID, который содержит информацию об учетной записи Google пользователя.
  5. Ваше приложение также получает маркер идентификатора после завершения потока, и вы сопоставляете его с идентификатором пользователя в маркере идентификатора, который был получен вашим сервером, чтобы зарегистрировать пользователя в вашем приложении.
Вход в связанную учетную запись.
Рисунок 1. Процесс входа в связанную учетную запись. Если у пользователя есть несколько учетных записей, вошедших в систему на своем устройстве, он может увидеть средство выбора учетной записи и перейдет к представлению входа в связанную учетную запись только в том случае, если он выберет связанную учетную запись.

Внедрите вход в связанную учетную запись в своем приложении для Android.

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

Обработка запросов кода авторизации от Google

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

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

HTTP-запрос

Образец запроса

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

Конечная точка обмена токенами должна иметь возможность обрабатывать следующие параметры запроса:

Параметры конечной точки токена
code Требуется код авторизации Google OAuth2.
client_id Обязательный идентификатор клиента, который вы предоставили Google.
client_secret Обязательный секретный код клиента, который вы предоставили Google.
access_token Требуемый токен доступа, выданный вами Google. Вы будете использовать это, чтобы получить контекст пользователя
grant_type Требуемое значение ДОЛЖНО быть установлено как urn:ietf:params:oauth:grant-type:reciprocal

Конечная точка обмена токенами должна ответить на запрос POST, выполнив следующие действия:

  • Убедитесь, что access_token был предоставлен Google, указанному в client_id .
  • Ответьте либо ответом HTTP 200 (ОК), если запрос действителен и код аутентификации успешно заменен на токен Google ID, либо кодом ошибки HTTP, если запрос недействителен.

HTTP-ответ

Успех

Вернуть код состояния HTTP 200 ОК

Пример успешного ответа
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Ошибки

В случае недействительного HTTP-запроса ответьте одним из следующих кодов ошибок HTTP:

Код состояния HTTP Тело Описание
400 {"error": "invalid_request"} В запросе отсутствует параметр, поэтому сервер не может продолжить обработку запроса. Это также может быть возвращено, если запрос включает неподдерживаемый параметр или повторяет параметр.
401 {"error": "invalid_request"} Аутентификация клиента не удалась, например, если запрос содержит неверный идентификатор или секрет клиента.
401 {"error": "invalid_token"}

Включите запрос аутентификации «WWW-Authentication: Bearer» в заголовок ответа.

Токен партнерского доступа недействителен.
403 {"error": "insufficient_permission"}

Включите запрос аутентификации «WWW-Authentication: Bearer» в заголовок ответа.

Токен партнерского доступа не содержит необходимых областей для выполнения взаимного OAuth.
500 {"error": "internal_error"} Ошибка сервера

Ответ об ошибке должен содержать следующие поля:

Поля ответа об ошибке
error Обязательная строка ошибки
error_description Читабельное описание ошибки
error_uri URI, который предоставляет более подробную информацию об ошибке.
Пример ответа на ошибку 400
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Код авторизации обмена для идентификационного токена

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

Чтобы обменять код авторизации на токен Google ID, вызовите конечную точку https://oauth2.googleapis.com/token и установите следующие параметры:

Поля запроса
client_id Обязательно Идентификатор клиента, полученный на странице учетных данных консоли API. Обычно это учетные данные с названием «Новые действия в приложении Google».
client_secret Обязательно Секрет клиента, полученный на странице учетных данных консоли API.
code Обязательно Код авторизации, отправленный в первоначальном запросе.
grant_type Обязательно. Как определено в спецификации OAuth 2.0 , значение этого поля должно быть установлено в authorization_code .
Образец запроса
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

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

Ответ содержит следующие поля:

Поля ответа
access_token Токен доступа, выданный Google, который ваше приложение отправляет для авторизации запроса Google API.
id_token Токен идентификатора содержит информацию об учетной записи Google пользователя. Раздел «Проверка ответа» содержит подробную информацию о том, как декодировать и проверять ответ токена идентификатора.
expires_in Оставшийся срок действия токена доступа в секундах
refresh_token Токен, который можно использовать для получения нового токена доступа. Токены обновления действительны до тех пор, пока пользователь не отзовет доступ.
scope Значение этого поля всегда равно openid для варианта использования входа в связанную учетную запись.
token_type Тип возвращенного токена. В настоящее время значение этого поля всегда установлено на Bearer
Пример ответа
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

Подтвердите ответ токена идентификатора

Проверка и декодирование утверждения JWT

Вы можете проверить и декодировать утверждение JWT, используя библиотеку JWT-декодирования для вашего языка . Используйте открытые ключи Google, доступные в форматах JWK или PEM , для проверки подписи токена.

В декодированном виде утверждение JWT выглядит следующим образом:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Помимо проверки подписи токена, убедитесь, что эмитент утверждения (поле iss ) — https://accounts.google.com , что аудитория (поле aud ) — это назначенный вам идентификатор клиента и что срок действия токена не истек ( exp поле).

Используя поля email , email_verified и hd вы можете определить, является ли Google хостингом и является ли он авторитетным для адреса электронной почты. В тех случаях, когда Google является авторитетным, пользователь в настоящее время известен как законный владелец учетной записи, и вы можете пропустить пароль или другие методы проверки. В противном случае эти методы можно использовать для проверки учетной записи перед привязкой.

Случаи, когда Google авторитетен:

  • email имеет суффикс @gmail.com , это учетная запись Gmail.
  • email_verified имеет значение true и установлен hd , это учетная запись G Suite.

Пользователи могут регистрировать учетные записи Google без использования Gmail или G Suite. Если email не содержит суффикса @gmail.com и hd отсутствует, Google не является авторитетным, и для проверки пользователя рекомендуется использовать пароль или другие методы запроса. email_verified также может иметь значение true, поскольку Google изначально проверил пользователя при создании учетной записи Google, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.