Привязка учетных записей Google позволяет владельцам учетных записей Google быстро, легко и безопасно подключаться к вашим службам и обмениваться данными с Google.
Вход в связанную учетную запись позволяет войти в систему с помощью Google одним касанием для пользователей, у которых уже есть учетная запись Google, связанная с вашей службой. Это упрощает работу пользователей, поскольку они могут войти в систему одним щелчком мыши, не вводя повторно имя пользователя и пароль. Это также снижает вероятность создания пользователями дублирующих учетных записей в вашем сервисе.
Требования
Чтобы реализовать вход в связанную учетную запись, вы должны выполнить следующие требования:
- У вас есть реализация связывания OAuth аккаунта Google , которая поддерживает поток кода авторизации OAuth 2.0. Ваша реализация OAuth должна включать следующие конечные точки:
- конечная точка авторизации для обработки запросов авторизации.
- конечная точка токена для обработки запроса на доступ и обновление токенов.
- конечная точка userinfo для получения основной информации об учетной записи связанного пользователя, которая отображается пользователю во время процесса входа в связанную учетную запись.
- У вас есть приложение для Android.
Как это работает
Предварительное условие: пользователь ранее связал свою учетную запись Google со своей учетной записью в вашем сервисе.
- Вы соглашаетесь на отображение связанных учетных записей во время входа в систему в одно касание.
- Пользователю отображается приглашение на вход в одно касание с возможностью войти в вашу службу с помощью связанной учетной записи.
- Если пользователь решает продолжить работу со связанной учетной записью, Google отправляет запрос на конечную точку вашего токена, чтобы сохранить код авторизации. Запрос содержит токен доступа пользователя, выданный вашим сервисом, и код авторизации Google.
- Вы обмениваете код авторизации Google на токен Google ID, который содержит информацию об учетной записи Google пользователя.
- Ваше приложение также получает маркер идентификатора после завершения потока, и вы сопоставляете его с идентификатором пользователя в маркере идентификатора, который был получен вашим сервером, чтобы зарегистрировать пользователя в вашем приложении.
![Вход в связанную учетную запись.](https://developers.google.cn/static/identity/one-tap/android/images/linked-account-signin.png?authuser=3&hl=ru)
Внедрите вход в связанную учетную запись в своем приложении для 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, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.