Обзор
Упрощенная функция входа через Google с использованием OAuth добавляет функцию входа через Google поверх существующей функции OAuth . Это обеспечивает удобную связь для пользователей Google, а также позволяет создавать учетные записи, что дает пользователю возможность создать новую учетную запись в вашем сервисе, используя свою учетную запись Google.
Для привязки учетной записи к OAuth и входа через Google выполните следующие общие шаги:
- Сначала попросите пользователя дать согласие на доступ к его профилю Google.
- Используйте информацию из их профиля, чтобы проверить, существует ли учетная запись пользователя.
- Для существующих пользователей необходимо связать учетные записи.
- Если вы не можете найти пользователя Google в своей системе аутентификации, проверьте токен идентификации, полученный от Google. Затем вы можете создать пользователя на основе информации профиля, содержащейся в токене идентификации.

Рисунок 1. Привязка учетных записей на телефоне пользователя с помощью упрощенной привязки.
Требования к упрощенной системе ссылок
- Реализуйте базовый процесс веб-аутентификации OAuth . Ваш сервис должен поддерживать авторизацию и обмен токенами , соответствующие стандарту OAuth 2.0.
- Ваша конечная точка обмена токенами должна поддерживать утверждения JSON Web Token (JWT) и реализовывать намерения
check,createиget.
Реализуйте свой OAuth-сервер.
Ваша конечная точка обмена токенов должна поддерживать интенты check , create и get . Выполните следующие шаги, чтобы завершить процесс привязки учетной записи и узнать, когда используются различные интенты:
- Есть ли у пользователя учетная запись в вашей системе аутентификации? (Пользователь принимает решение, выбирая «ДА» или «НЕТ»)
- ДА: Использует ли пользователь адрес электронной почты, связанный с его учетной записью Google, для входа на вашу платформу? (Пользователь принимает решение, выбирая ДА или НЕТ)
- ДА: Есть ли у пользователя соответствующая учетная запись в вашей системе аутентификации? (для подтверждения вызывается
check intent)- ДА: если запрос
get intentintent успешно завершается, то вызывается метод getIntent, и учетная запись связывается. - НЕТ: Создать новую учетную запись? (Пользователь принимает решение, выбирая ДА или НЕТ)
- ДА: если функция создания
create intentуспешно завершается, вызывается метод createint, и учетная запись связывается. - НЕТ: Запускается процесс Web OAuth, пользователь перенаправляется в свой браузер, и ему предоставляется возможность перейти по ссылке, указав другой адрес электронной почты.
- ДА: если функция создания
- ДА: если запрос
- НЕТ: Запускается процесс Web OAuth , пользователь перенаправляется в свой браузер, и ему предоставляется возможность перейти по ссылке, указав другой адрес электронной почты.
- ДА: Есть ли у пользователя соответствующая учетная запись в вашей системе аутентификации? (для подтверждения вызывается
- НЕТ: Есть ли у пользователя соответствующая учетная запись в вашей системе аутентификации? (для подтверждения вызывается
check intent)- ДА: если запрос
get intentintent успешно завершается, то вызывается метод getIntent, и учетная запись связывается. - НЕТ: если функция создания намерения успешно завершается, вызывается метод
create intent, и учетная запись связывается.
- ДА: если запрос
- ДА: Использует ли пользователь адрес электронной почты, связанный с его учетной записью Google, для входа на вашу платформу? (Пользователь принимает решение, выбирая ДА или НЕТ)
Проверить существующую учетную запись пользователя (проверить намерение)
После того как пользователь дает согласие на доступ к своему профилю Google, Google отправляет запрос, содержащий подписанное подтверждение личности пользователя Google. Утверждение содержит информацию, включающую идентификатор аккаунта Google, имя и адрес электронной почты пользователя. Конечная точка обмена токенами, настроенная для вашего проекта, обрабатывает этот запрос.
Если соответствующая учетная запись Google уже присутствует в вашей системе аутентификации, ваша конечная точка обмена токенами отвечает account_found=true . Если учетная запись Google не соответствует существующему пользователю, ваша конечная точка обмена токенами возвращает ошибку HTTP 404 Not Found с account_found=false .
Запрос имеет следующую форму:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Конечная точка обмена токенами должна иметь возможность обрабатывать следующие параметры:
| Параметры конечной точки токена | |
|---|---|
intent | Для этих запросов значение этого параметра — check . |
grant_type | Тип обмениваемого токена. Для этих запросов этот параметр имеет значение urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion | Веб-токен JSON (JWT), который обеспечивает подписанное подтверждение личности пользователя Google. JWT содержит информацию, включающую идентификатор учетной записи Google, имя и адрес электронной почты пользователя. |
client_id | Идентификатор клиента, который вы назначили Google. |
client_secret | Секрет клиента, который вы передали Google. |
Чтобы ответить на запросы о намерении check , ваша конечная точка обмена токенами должна выполнить следующие шаги:
- Проверьте и декодируйте утверждение JWT.
- Проверьте, присутствует ли уже учетная запись Google в вашей системе аутентификации.
Проверка и декодирование утверждения 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, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.
Проверьте, присутствует ли учетная запись Google в вашей системе аутентификации.
Проверьте, верно ли одно из следующих условий:
- Идентификатор аккаунта Google, указанный в
subутверждения, находится в вашей базе данных пользователей. - Адрес электронной почты в утверждении соответствует пользователю в вашей базе данных пользователей.
Если любое из условий верно, пользователь уже зарегистрировался. В этом случае верните ответ, подобный следующему:
HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8
{
"account_found":"true",
}
Если ни идентификатор аккаунта Google, ни адрес электронной почты, указанные в утверждении, не соответствуют пользователю в вашей базе данных, значит, пользователь еще не зарегистрировался. В этом случае ваша конечная точка обмена токенами должна ответить ошибкой HTTP 404, в которой указано "account_found": "false" , как в следующем примере:
HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8
{
"account_found":"false",
}
Обработка автоматического связывания (получение намерения)
После того как пользователь дает согласие на доступ к своему профилю Google, Google отправляет запрос, содержащий подписанное подтверждение личности пользователя Google. Утверждение содержит информацию, включающую идентификатор аккаунта Google, имя и адрес электронной почты пользователя. Конечная точка обмена токенами, настроенная для вашего проекта, обрабатывает этот запрос.
Если соответствующая учетная запись Google уже присутствует в вашей системе аутентификации, ваша конечная точка обмена токенами возвращает токен пользователю. Если учетная запись Google не соответствует существующему пользователю, ваша конечная точка обмена токенами возвращает ошибку linking_error и необязательный login_hint .
Запрос имеет следующую форму:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Конечная точка обмена токенами должна иметь возможность обрабатывать следующие параметры:
| Параметры конечной точки токена | |
|---|---|
intent | Для этих запросов значение этого параметра равно get . |
grant_type | Тип обмениваемого токена. Для этих запросов этот параметр имеет значение urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion | Веб-токен JSON (JWT), который обеспечивает подписанное подтверждение личности пользователя Google. JWT содержит информацию, включающую идентификатор учетной записи Google, имя и адрес электронной почты пользователя. |
scope | Необязательно: любые области действия, которые вы настроили Google для запроса от пользователей. |
client_id | Идентификатор клиента, который вы назначили Google. |
client_secret | Секрет клиента, который вы передали Google. |
Чтобы ответить на запросы get Intent, ваша конечная точка обмена токенами должна выполнить следующие шаги:
- Проверьте и декодируйте утверждение JWT.
- Проверьте, присутствует ли уже учетная запись Google в вашей системе аутентификации.
Проверка и декодирование утверждения 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, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.
Проверьте, присутствует ли учетная запись Google в вашей системе аутентификации.
Проверьте, верно ли одно из следующих условий:
- Идентификатор аккаунта Google, указанный в
subутверждения, находится в вашей базе данных пользователей. - Адрес электронной почты в утверждении соответствует пользователю в вашей базе данных пользователей.
Если для пользователя найдена учетная запись, выдайте токен доступа и верните значения в объекте JSON в теле вашего ответа HTTPS, как в следующем примере:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
В некоторых случаях привязка учетной записи на основе токена идентификатора может оказаться неудачной для пользователя. Если это происходит по какой-либо причине, ваша конечная точка обмена токенами должна ответить ошибкой HTTP 401, которая указывает error=linking_error , как показано в следующем примере:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
Когда Google получает ответ об ошибке 401 с linking_error , Google отправляет пользователя в вашу конечную точку авторизации с login_hint в качестве параметра. Пользователь завершает привязку учетной записи, используя процесс привязки OAuth в своем браузере.
Создание учетной записи с использованием функции «Вход через Google» (создание намерения).
Когда пользователю необходимо создать учетную запись в вашем сервисе, Google отправляет запрос к вашей конечной точке обмена токенов, указывая intent=create .
Запрос имеет следующий вид:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Ваша конечная точка обмена токенов должна уметь обрабатывать следующие параметры:
| Параметры конечной точки токена | |
|---|---|
intent | Для таких запросов значение этого параметра равно create . |
grant_type | Тип обмениваемого токена. Для таких запросов этот параметр имеет значение urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion | JSON Web Token (JWT) — это подписанное подтверждение личности пользователя Google. JWT содержит информацию, включающую идентификатор учетной записи Google, имя и адрес электронной почты пользователя. |
client_id | Идентификатор клиента, который вы присвоили Google. |
client_secret | Секретный ключ клиента, который вы присвоили Google. |
JWT-токен в параметре assertion содержит идентификатор учетной записи Google пользователя, имя и адрес электронной почты, которые можно использовать для создания новой учетной записи в вашем сервисе.
Для ответа на запросы create намерения ваш конечный пункт обмена токенов должен выполнить следующие шаги:
- Проверьте и расшифруйте утверждение JWT.
- Проверьте данные пользователя и создайте новую учетную запись.
Проверка и декодирование утверждения 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, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.
Проверьте данные пользователя и создайте новую учетную запись.
Проверьте, выполняется ли хотя бы одно из следующих условий:
- Идентификатор учетной записи Google, указанный в
subутверждения, находится в вашей базе данных пользователей. - Адрес электронной почты в утверждении соответствует пользователю в вашей базе данных пользователей.
Если выполняется хотя бы одно из условий, предложите пользователю связать свою существующую учетную запись с учетной записью Google. Для этого ответьте на запрос ошибкой HTTP 401, указав error=linking_error и адрес электронной почты пользователя в качестве login_hint . Ниже приведен пример ответа:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
Когда Google получает ответ с ошибкой 401 и linking_error , он перенаправляет пользователя на вашу конечную точку авторизации, передавая параметр login_hint . Пользователь завершает привязку учетной записи, используя процесс привязки OAuth в своем браузере.
Если ни одно из условий не выполняется, создайте новую учетную запись пользователя, используя информацию, предоставленную в JWT. Для новых учетных записей обычно не устанавливается пароль. Рекомендуется добавить функцию «Вход через Google» на другие платформы, чтобы пользователи могли входить в систему через Google на всех платформах вашего приложения. В качестве альтернативы вы можете отправить пользователю ссылку по электронной почте, которая запустит процесс восстановления пароля, позволяя пользователю установить пароль для входа на другие платформы.
После завершения создания выдайте токен доступа. и вернуть значения в виде JSON-объекта в теле HTTPS-ответа, как в следующем примере:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Получите свой идентификатор клиента Google API.
В процессе регистрации для привязки учетной записи вам потребуется указать свой идентификатор клиента Google API.
Чтобы получить идентификатор клиента API, используя проект, созданный вами при выполнении шагов по привязке OAuth , выполните следующие действия:
- Перейдите на страницу «Клиенты» .
Создайте или выберите проект Google API.
Если для вашего проекта отсутствует идентификатор клиента (Client ID) для типа веб-приложения, нажмите «Создать клиент» (Create Client) , чтобы его создать. Обязательно укажите домен вашего сайта в поле «Разрешенные источники JavaScript» . При локальном тестировании или разработке необходимо добавить в поле « Разрешенные источники JavaScript» как
http://localhostтак иhttp://localhost:<port_number>.
Проверьте правильность вашей реализации.
Вы можете проверить свою реализацию, используя инструмент OAuth 2.0 Playground .
В инструменте выполните следующие действия:
- Нажмите конфигурации », чтобы открыть окно «Конфигурация OAuth 2.0».
- В поле «Процесс аутентификации OAuth» выберите «На стороне клиента» .
- В поле «Конечные точки OAuth» выберите «Пользовательские» .
- Укажите в соответствующих полях вашу конечную точку OAuth 2.0 и идентификатор клиента, который вы присвоили Google.
- В разделе «Шаг 1» не выбирайте никаких областей действия Google. Вместо этого оставьте это поле пустым или введите область действия, действительную для вашего сервера (или произвольную строку, если вы не используете области действия OAuth). После завершения нажмите «Авторизовать API» .
- В разделах «Шаг 2» и «Шаг 3» пройдите весь процесс аутентификации OAuth 2.0 и убедитесь, что каждый шаг работает должным образом.
Вы можете проверить работоспособность своей реализации, используя демонстрационный инструмент для привязки учетных записей Google .
В инструменте выполните следующие действия:
- Нажмите кнопку « Войти через Google» .
- Выберите учетную запись, которую хотите связать.
- Введите идентификатор службы.
- При желании укажите одну или несколько областей доступа, к которым вы запрашиваете доступ.
- Нажмите «Начать демонстрацию» .
- При появлении запроса подтвердите свое согласие и отклоните запрос на привязку.
- Убедитесь, что вас перенаправили на вашу платформу.