Упрощенная интеграция с OAuth и вход через Google.

Обзор

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

Для привязки учетной записи к OAuth и входа через Google выполните следующие общие шаги:

  1. Сначала попросите пользователя дать согласие на доступ к его профилю Google.
  2. Используйте информацию из их профиля, чтобы проверить, существует ли учетная запись пользователя.
  3. Для существующих пользователей необходимо связать учетные записи.
  4. Если вы не можете найти пользователя Google в своей системе аутентификации, проверьте токен идентификации, полученный от Google. Затем вы можете создать пользователя на основе информации профиля, содержащейся в токене идентификации.
На этом рисунке показаны шаги, необходимые пользователю для привязки своей учетной записи Google с помощью упрощенного процесса привязки. На первом скриншоте показано, как пользователь может выбрать ваше приложение для привязки. На втором скриншоте пользователь может подтвердить, есть ли у него уже существующая учетная запись в вашем сервисе. На третьем скриншоте пользователь может выбрать учетную запись Google, с которой он хочет привязать свою учетную запись. На четвертом скриншоте показано подтверждение привязки учетной записи Google к вашему приложению. На пятом скриншоте показана успешно привязанная учетная запись пользователя в приложении Google.

Рисунок 1. Привязка учетных записей на телефоне пользователя с помощью упрощенной привязки.

Требования к упрощенной системе ссылок

Реализуйте свой OAuth-сервер.

Ваша конечная точка обмена токенов должна поддерживать интенты check , create и get . Выполните следующие шаги, чтобы завершить процесс привязки учетной записи и узнать, когда используются различные интенты:

  1. Есть ли у пользователя учетная запись в вашей системе аутентификации? (Пользователь принимает решение, выбирая «ДА» или «НЕТ»)
    1. ДА: Использует ли пользователь адрес электронной почты, связанный с его учетной записью Google, для входа на вашу платформу? (Пользователь принимает решение, выбирая ДА или НЕТ)
      1. ДА: Есть ли у пользователя соответствующая учетная запись в вашей системе аутентификации? (для подтверждения вызывается check intent )
        1. ДА: если запрос get intent intent успешно завершается, то вызывается метод getIntent, и учетная запись связывается.
        2. НЕТ: Создать новую учетную запись? (Пользователь принимает решение, выбирая ДА или НЕТ)
          1. ДА: если функция создания create intent успешно завершается, вызывается метод createint, и учетная запись связывается.
          2. НЕТ: Запускается процесс Web OAuth, пользователь перенаправляется в свой браузер, и ему предоставляется возможность перейти по ссылке, указав другой адрес электронной почты.
      2. НЕТ: Запускается процесс Web OAuth , пользователь перенаправляется в свой браузер, и ему предоставляется возможность перейти по ссылке, указав другой адрес электронной почты.
    2. НЕТ: Есть ли у пользователя соответствующая учетная запись в вашей системе аутентификации? (для подтверждения вызывается check intent )
      1. ДА: если запрос get intent intent успешно завершается, то вызывается метод getIntent, и учетная запись связывается.
      2. НЕТ: если функция создания намерения успешно завершается, вызывается метод create intent , и учетная запись связывается.

Check for an existing user account (check intent)

After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.

If the corresponding Google account is already present in your authentication system, your token exchange endpoint responds with account_found=true. If the Google account doesn't match an existing user, your token exchange endpoint returns an HTTP 404 Not Found error with account_found=false.

The request has the following form:

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

Your token exchange endpoint must be able to handle the following parameters:

Token endpoint parameters
intent For these requests, the value of this parameter is check.
grant_type The type of token being exchanged. For these requests, this parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer.
assertion A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address.
client_id The client ID you assigned to Google.
client_secret The client secret you assigned to Google.

To respond to the check intent requests, your token exchange endpoint must perform the following steps:

  • Validate and decode the JWT assertion.
  • Check if the Google account is already present in your authentication system.
Проверка и декодирование утверждения 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, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.

Check if the Google account is already present in your authentication system

Check whether either of the following conditions are true:

  • The Google Account ID, found in the assertion's sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If either condition is true, the user has already signed up. In that case, return a response like the following:

HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8

{
  "account_found":"true",
}

If neither the Google Account ID nor the email address specified in the assertion matches a user in your database, the user hasn't signed up yet. In this case, your token exchange endpoint needs to reply with a HTTP 404 error that specifies "account_found": "false", as in the following example:

HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8

{
  "account_found":"false",
}

Handle automatic linking (get intent)

After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.

If the corresponding Google Account is already present in your authentication system, your token exchange endpoint returns a token for the user. If the Google Account doesn't match an existing user, your token exchange endpoint returns a linking_error error and optional login_hint.

The request has the following form:

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

Your token exchange endpoint must be able to handle the following parameters:

Token endpoint parameters
intent For these requests, the value of this parameter is get.
grant_type The type of token being exchanged. For these requests, this parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer.
assertion A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address.
scope Optional: Any scopes that you've configured Google to request from users.
client_id The client ID you assigned to Google.
client_secret The client secret you assigned to Google.

To respond to the get intent requests, your token exchange endpoint must perform the following steps:

  • Validate and decode the JWT assertion.
  • Check if the Google account is already present in your authentication system.
Проверка и декодирование утверждения 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, однако с тех пор право собственности на стороннюю учетную запись электронной почты могло измениться.

Check if the Google account is already present in your authentication system

Check whether either of the following conditions are true:

  • The Google Account ID, found in the assertion's sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If an account is found for the user, issue an access token and return the values in a JSON object in the body of your HTTPS response, like in the following example:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",
  "refresh_token": "REFRESH_TOKEN",
  "expires_in": SECONDS_TO_EXPIRATION
}

In some cases, account linking based on ID token might fail for the user. If it does so for any reason, your token exchange endpoint needs to reply with a HTTP 401 error that specifies error=linking_error, as the following example shows:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

When Google receives a 401 error response with linking_error, Google sends the user to your authorization endpoint with login_hint as a parameter. The user completes account linking using the OAuth linking flow in their browser.

Создание учетной записи с использованием функции «Вход через 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 , выполните следующие действия:

  1. Перейдите на страницу «Клиенты» .
  2. Создайте или выберите проект Google API.

    Если для вашего проекта отсутствует идентификатор клиента (Client ID) для типа веб-приложения, нажмите «Создать клиент» (Create Client) , чтобы его создать. Обязательно укажите домен вашего сайта в поле «Разрешенные источники JavaScript» . При локальном тестировании или разработке необходимо добавить в поле « Разрешенные источники JavaScript» как http://localhost так и http://localhost:<port_number> .

Проверьте правильность вашей реализации.

Вы можете проверить свою реализацию, используя инструмент OAuth 2.0 Playground .

В инструменте выполните следующие действия:

  1. Нажмите конфигурации », чтобы открыть окно «Конфигурация OAuth 2.0».
  2. В поле «Процесс аутентификации OAuth» выберите «На стороне клиента» .
  3. В поле «Конечные точки OAuth» выберите «Пользовательские» .
  4. Укажите в соответствующих полях вашу конечную точку OAuth 2.0 и идентификатор клиента, который вы присвоили Google.
  5. В разделе «Шаг 1» не выбирайте никаких областей действия Google. Вместо этого оставьте это поле пустым или введите область действия, действительную для вашего сервера (или произвольную строку, если вы не используете области действия OAuth). После завершения нажмите «Авторизовать API» .
  6. В разделах «Шаг 2» и «Шаг 3» пройдите весь процесс аутентификации OAuth 2.0 и убедитесь, что каждый шаг работает должным образом.

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

В инструменте выполните следующие действия:

  1. Нажмите кнопку « Войти через Google» .
  2. Выберите учетную запись, которую хотите связать.
  3. Введите идентификатор службы.
  4. При желании укажите одну или несколько областей доступа, к которым вы запрашиваете доступ.
  5. Нажмите «Начать демонстрацию» .
  6. При появлении запроса подтвердите свое согласие и отклоните запрос на привязку.
  7. Убедитесь, что вас перенаправили на вашу платформу.