Вход в связанную учетную запись

Связывание аккаунтов 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 OK

Пример успешного ответа
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."
}

Код авторизации биржи для токена ID

Вам нужно будет обменять полученный код авторизации на токен 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, который ваше приложение отправляет для авторизации запроса API Google.
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

Подтвердите ответ ID Token

Проверить и декодировать утверждение 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_verfied также может иметь значение true, поскольку Google изначально проверил пользователя при создании учетной записи Google, однако право собственности на стороннюю учетную запись электронной почты с тех пор могло измениться.