Vinculación optimizada con OAuth y el inicio de sesión de Google

Visión general

Basada en OAuth vinculación de sesión de Google optimizada añade acceso de Google en la parte superior de OAuth vinculación . Esto proporciona una experiencia de vinculación perfecta para los usuarios de Google y también permite la vinculación de cuentas para los usuarios que se registraron en su servicio con una identidad que no es de Google.

Para realizar la vinculación de cuentas con OAuth y el inicio de sesión de Google, siga estos pasos generales:

  1. Primero, solicite al usuario que dé su consentimiento para acceder a su perfil de Google.
  2. Utilice la información de su perfil para comprobar si existe la cuenta de usuario.
  3. Para usuarios existentes, vincule las cuentas.
  4. Si no puede encontrar una coincidencia para el usuario de Google en su sistema de autenticación, valide el token de identificación recibido de Google. A continuación, puede crear un usuario en función de la información de perfil contenida en el token de ID.

Figura 3. Vinculación de cuenta en el teléfono de un usuario con vinculación simplificada

Cuentas están vinculadas mediante OAuth estándar de la industria fluye 2,0 código implícito y autorización. Su servicio debe admitir la autorización OAuth 2.0 compatible con los puntos finales y de cambio de fichas. Además, su punto final Cambio de Ficha debería apoyar web JSON Token (JWT) afirmaciones e implementar el check , create y get intenciones.

Obtenga su ID de cliente y el secreto de la API de Google

Usted tendrá que obtener su API Client ID y secreto mediante el proyecto que ha creado al completar los OAuth Linking pasos. Para hacerlo, complete los siguientes pasos:

  1. Abra la página Credenciales de la consola de API de Google .
  2. Cree o seleccione un proyecto de API de Google.

    Si el proyecto no tiene un ID de cliente para el tipo de aplicación Web, haga clic en Crear credenciales> OAuth ID de cliente para crear una. Asegúrese de incluir el dominio de su sitio en el palco de los orígenes de JavaScript autorizados. Al realizar pruebas o desarrollo locales, debe agregar tanto http://localhost y http://localhost:<port_number> al campo orígenes JavaScript autorizado.

Implemente su servidor OAuth

检查现有的用户帐户

用户同意访问其Google个人资料后,Google会发送请求,其中包含对Google用户身份的签名声明。断言包含的信息包括用户的Google帐户ID,名称和电子邮件地址。为您的项目配置的令牌交换端点处理该请求。

如果您的身份验证系统中已经存在相应的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

您的令牌交换端点必须能够处理以下参数:

令牌端点参数
intent对于这些请求,此参数的值为check
grant_type交换令牌的类型。对于这些请求,此参数的值为urn:ietf:params:oauth:grant-type:jwt-bearer
assertion JSON Web令牌(JWT),提供对Google用户身份的签名断言。 JWT包含的信息包括用户的Google帐户ID,名称和电子邮件地址。

当您的令牌交换端点接收到check请求时,它需要验证和解码JWT断言。

Validar y decodificar la aserción JWT

Puede validar y decodificar la aserción JWT utilizando una biblioteca de decodificación JWT para su idioma . Utilice las claves públicas de Google, disponibles en formatos JWK o PEM , para verificar la firma del token.

Cuando se decodifica, la aserción JWT se parece al siguiente ejemplo:

{
  "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
}

Además de verificar la firma del token, verifique que el emisor de la afirmación (campo iss ) sea https://accounts.google.com , que la audiencia (campo aud ) sea su ID de cliente asignado y que el token no haya caducado ( exp campo).

Con los campos email , email_verified y hd puede determinar si Google aloja y tiene autoridad para una dirección de correo electrónico. En los casos en que Google tiene autoridad, se sabe que el usuario es el propietario legítimo de la cuenta y puede omitir la contraseña u otros métodos de desafío. De lo contrario, estos métodos se pueden utilizar para verificar la cuenta antes de vincularla.

Casos en los que Google tiene autoridad:

  • email tiene un sufijo @gmail.com , esta es una cuenta de Gmail.
  • email_verified es verdadero y hd está configurado, esta es una cuenta de G Suite.

Los usuarios pueden registrarse para obtener cuentas de Google sin usar Gmail o G Suite. Cuando el email no contiene un sufijo @gmail.com y no hay hd Google no tiene autoridad y se recomienda utilizar una contraseña u otros métodos de desafío para verificar al usuario. email_verfied también puede ser cierto ya que Google verificó inicialmente al usuario cuando se creó la cuenta de Google, sin embargo, la propiedad de la cuenta de correo electrónico de terceros puede haber cambiado desde entonces.

检查您的身份验证系统中是否已存在Google帐户

检查以下条件之一是否成立:

  • 在断言的sub字段中找到的Google帐户ID在您的用户数据库中。
  • 断言中的电子邮件地址与您的用户数据库中的用户匹配。

如果任一条件为真,则用户已经注册。在这种情况下,返回如下响应:

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

{
  "account_found":"true",
}

然后,Google向用户显示一个链接同意对话框,并请求同意所需的范围,以便继续进行链接。 Google征得用户同意后,Google get向您的令牌端点发送一个get请求,以继续进行链接。

如果断言中指定的Google帐户ID或电子邮件地址都不匹配您数据库中的用户,则该用户尚未注册。在这种情况下,令牌交换端点需要使用HTTP 404错误进行响应,该错误指定为"account_found": "false" ,如以下示例所示:

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

{
  "account_found":"false",
}
当Google收到带有"account_found": "false"错误的404错误响应时,Google会向用户显示一个对话框,以请求同意创建新帐户并访问所需的范围。 Google征得用户同意后,Google会使用设置为intent参数的值调用您的令牌交换端点,以create该令牌,并包括一个ID令牌,该令牌包含请求中的用户个人资料信息。

处理自动链接

用户同意访问其Google个人资料后,Google会发送一个请求,其中包含对Google用户身份的签名声明。断言包含的信息包括用户的Google帐户ID,名称和电子邮件地址。为您的项目配置的令牌交换端点处理该请求。

如果您的身份验证系统中已经存在相应的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

您的令牌交换端点必须能够处理以下参数:

令牌端点参数
intent对于这些请求,此参数的值为get
grant_type交换令牌的类型。对于这些请求,此参数的值为urn:ietf:params:oauth:grant-type:jwt-bearer
assertion JSON Web令牌(JWT),提供对Google用户身份的签名断言。 JWT包含的信息包括用户的Google帐户ID,名称和电子邮件地址。
scope可选:您已配置Google来向用户请求的所有范围。

当您的令牌交换端点接收到链接请求时,它需要验证并解码JWT断言。

Validar y decodificar la aserción JWT

Puede validar y decodificar la aserción JWT utilizando una biblioteca de decodificación JWT para su idioma . Utilice las claves públicas de Google, disponibles en formatos JWK o PEM , para verificar la firma del token.

Cuando se decodifica, la aserción JWT se parece al siguiente ejemplo:

{
  "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
}

Además de verificar la firma del token, verifique que el emisor de la afirmación (campo iss ) sea https://accounts.google.com , que la audiencia (campo aud ) sea su ID de cliente asignado y que el token no haya caducado ( exp campo).

Con los campos email , email_verified y hd puede determinar si Google aloja y tiene autoridad para una dirección de correo electrónico. En los casos en que Google tiene autoridad, se sabe que el usuario es el propietario legítimo de la cuenta y puede omitir la contraseña u otros métodos de desafío. De lo contrario, estos métodos se pueden utilizar para verificar la cuenta antes de vincularla.

Casos en los que Google tiene autoridad:

  • email tiene un sufijo @gmail.com , esta es una cuenta de Gmail.
  • email_verified es verdadero y hd está configurado, esta es una cuenta de G Suite.

Los usuarios pueden registrarse para obtener cuentas de Google sin usar Gmail o G Suite. Cuando el email no contiene un sufijo @gmail.com y no hay hd Google no tiene autoridad y se recomienda utilizar una contraseña u otros métodos de desafío para verificar al usuario. email_verfied también puede ser cierto ya que Google verificó inicialmente al usuario cuando se creó la cuenta de Google, sin embargo, la propiedad de la cuenta de correo electrónico de terceros puede haber cambiado desde entonces.

检查您的身份验证系统中是否已存在Google帐户

检查以下条件之一是否成立:

  • 在断言的sub字段中找到的Google帐户ID在您的用户数据库中。
  • 断言中的电子邮件地址与您的用户数据库中的用户匹配。

在某些情况下,对于用户而言,基于ID令牌的帐户链接可能会失败。如果出于某种原因这样做,则令牌交换端点需要使用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收到带有linking_error的401错误响应时,Google会在请求中使用以下内容调用您的令牌交换端点:

  • 设置要createintent参数
  • 具有ID令牌和用户个人资料信息的JWT

通过 Google Sign-In 处理帐户创建

当用户需要创建您的服务帐户,谷歌发出请求到您的令牌交换端点,指出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

您的令牌交换端点必须能够处理以下参数:

令牌端点参数
intent对于这些请求,这个参数的值是create
grant_type正在交换的令牌类型。对于这些请求,这个参数的值是urn:ietf:params:oauth:grant-type:jwt-bearer
assertion一个 JSON 网络令牌 (JWT),提供 Google 用户身份的签名断言。 JWT 包含的信息包括用户的 Google 帐户 ID、姓名和电子邮件地址。

在中智威汤逊assertion参数包含用户的谷歌帐户ID,姓名和电子邮件地址,你可以用它来创建你的服务的新帐户。

要响应帐户创建请求,您的令牌交换端点必须执行以下两个部分中的步骤。

Validar y decodificar la aserción JWT

Puede validar y decodificar la aserción JWT utilizando una biblioteca de decodificación JWT para su idioma . Utilice las claves públicas de Google, disponibles en formatos JWK o PEM , para verificar la firma del token.

Cuando se decodifica, la aserción JWT se parece al siguiente ejemplo:

{
  "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
}

Además de verificar la firma del token, verifique que el emisor de la afirmación (campo iss ) sea https://accounts.google.com , que la audiencia (campo aud ) sea su ID de cliente asignado y que el token no haya caducado ( exp campo).

Con los campos email , email_verified y hd puede determinar si Google aloja y tiene autoridad para una dirección de correo electrónico. En los casos en que Google tiene autoridad, se sabe que el usuario es el propietario legítimo de la cuenta y puede omitir la contraseña u otros métodos de desafío. De lo contrario, estos métodos se pueden utilizar para verificar la cuenta antes de vincularla.

Casos en los que Google tiene autoridad:

  • email tiene un sufijo @gmail.com , esta es una cuenta de Gmail.
  • email_verified es verdadero y hd está configurado, esta es una cuenta de G Suite.

Los usuarios pueden registrarse para obtener cuentas de Google sin usar Gmail o G Suite. Cuando el email no contiene un sufijo @gmail.com y no hay hd Google no tiene autoridad y se recomienda utilizar una contraseña u otros métodos de desafío para verificar al usuario. email_verfied también puede ser cierto ya que Google verificó inicialmente al usuario cuando se creó la cuenta de Google, sin embargo, la propiedad de la cuenta de correo electrónico de terceros puede haber cambiado desde entonces.

验证用户信息并创建新帐户

检查以下任一条件是否为真:

  • 该谷歌帐户ID,在断言的发现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"
}

当谷歌收到401错误响应linking_error ,谷歌会将用户带到你的授权端点login_hint作为参数。用户使用浏览器中的 OAuth 链接流程完成帐户链接。

如果这两个条件都不成立,请使用 JWT 中提供的信息创建一个新用户帐户。新帐户通常没有密码设置。建议您将 Google Sign-In 添加到其他平台,以使用户能够在您的应用程序的各个方面使用 Google 登录。或者,您可以通过电子邮件向用户发送启动密码恢复流程的链接,以允许用户设置密码以在其他平台上登录。

当完成创作,发出一个访问令牌 和刷新令牌 并在HTTPS响应的主体在下面的例子中JSON对象返回的值,比如:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",

  "refresh_token": "REFRESH_TOKEN",

  "expires_in": SECONDS_TO_EXPIRATION
}

Validando su implementación

您可以通过使用验证实现的OAuth 2.0游乐场工具。

在工具中,执行以下步骤:

  1. 单击配置打开的OAuth 2.0配置窗口。
  2. OAuth流场中,选择客户端
  3. OAuth端点字段中,选择自定义
  4. 在相应字段中指定您的 OAuth 2.0 端点和您分配给 Google 的客户端 ID。
  5. 步骤1部分,不要选择任何谷歌范围。相反,将此字段留空或键入对您的服务器有效的范围(如果不使用 OAuth 范围,则输入任意字符串)。当您完成后,单击授权的API。
  6. 步骤2步骤3段,完成OAuth 2.0流程和验证每个步骤按预期工作。

您可以通过验证您的实现谷歌帐户链接演示工具。

在工具中,执行以下步骤:

  1. 点击登录在与谷歌按钮。
  2. 选择您要关联的帐户。
  3. 输入服务标识。
  4. (可选)输入您将请求访问的一个或多个范围。
  5. 单击开始演示
  6. 出现提示时,确认您可以同意并拒绝链接请求。
  7. 确认您被重定向到您的平台。