Связывание аккаунтов Google позволяет владельцам аккаунтов Google быстро, беспрепятственно и безопасно подключаться к вашим службам и обмениваться данными с Google.
Вход в связанную учетную запись позволяет выполнять вход в Google одним нажатием для пользователей, учетная запись Google которых уже связана с вашей службой. Это упрощает работу пользователей, поскольку они могут войти в систему одним щелчком мыши без повторного ввода имени пользователя и пароля. Это также снижает вероятность того, что пользователи создадут дубликаты учетных записей в вашем сервисе.
Требования
Чтобы реализовать вход со связанной учетной записью, необходимо выполнить следующие требования:
- У вас есть реализация связывания OAuth аккаунта Google , которая поддерживает поток кода авторизации OAuth 2.0. Ваша реализация OAuth должна включать следующие конечные точки:
- конечная точка авторизации для обработки запросов на авторизацию.
- конечная точка токена для обработки запросов на доступ и токены обновления.
- Конечная точка userinfo для получения основных сведений об учетной записи о связанном пользователе, которые отображаются пользователю во время процесса входа в связанную учетную запись.
- У вас есть приложение для Android.
Как это работает
Условие : пользователь ранее связал свой аккаунт Google со своим аккаунтом в вашем сервисе.
- Вы даете согласие на отображение связанных учетных записей во время процесса входа в систему одним нажатием.
- Пользователю отображается приглашение для входа в систему одним касанием с возможностью входа в вашу службу с помощью связанной учетной записи.
- Если пользователь решит продолжить использование связанной учетной записи, Google отправляет запрос на конечную точку вашего токена для сохранения кода авторизации. Запрос содержит токен доступа пользователя, выданный вашим сервисом, и код авторизации Google.
- Вы обмениваете код авторизации Google на токен Google ID, который содержит информацию об учетной записи Google пользователя.
- Ваше приложение также получает токен идентификатора, когда поток завершается, и вы сопоставляете его с идентификатором пользователя в токене идентификатора, который был получен вашим сервером, чтобы подписать пользователя в ваше приложение.

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