Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Inicio de sesión de Google para televisores y dispositivos

Puede permitir que los usuarios inicien sesión en su aplicación con sus cuentas de Google en dispositivos con capacidades de entrada limitadas, como televisores conectados a Internet.

La aplicación muestra un código corto y una URL de inicio de sesión para el usuario. Luego, el usuario abre la URL de inicio de sesión en un navegador web, ingresa el código y otorga permiso a la aplicación para acceder a la información de inicio de sesión del usuario. Finalmente, la aplicación recibe confirmación y el usuario inicia sesión.

Para usar este flujo de inicio de sesión, la aplicación debe ejecutarse en un dispositivo que cumpla con los siguientes criterios:

  • El dispositivo debe poder mostrar una URL de 40 caracteres y un código de usuario de 15 caracteres, junto con instrucciones para el usuario.
  • El dispositivo debe estar conectado a Internet.

Obtenga una identificación de cliente y un secreto de cliente

Su aplicación necesita un ID de cliente de OAuth 2.0 y un secreto de cliente para realizar solicitudes a los extremos de inicio de sesión de Google.

Para encontrar el ID de cliente y el secreto del cliente de su proyecto, haga lo siguiente:

  1. Seleccione una credencial de OAuth 2.0 existente o abra la página Credenciales .
  2. Si aún no lo ha hecho, cree las credenciales de OAuth 2.0 de su proyecto haciendo clic en Crear credenciales> ID de cliente de OAuth y proporcione la información necesaria para crear las credenciales.
  3. Busque el ID de cliente en la sección ID de cliente de OAuth 2.0 . Para obtener más detalles, haga clic en el ID de cliente.

Si está creando una nueva ID de cliente, seleccione el tipo de aplicación de televisores y dispositivos de entrada limitada .

Obtenga un código de usuario y una URL de verificación

Una vez que un usuario solicita iniciar sesión con una cuenta de Google, obtiene un código de usuario y una URL de verificación enviando una solicitud HTTP POST al extremo del dispositivo OAuth 2.0, https://oauth2.googleapis.com/device/code . Incluya su ID de cliente y una lista de los ámbitos que necesita con la solicitud. Si solo desea iniciar sesión en usuarios con sus cuentas de Google, solicite solo el profile y email alcances de email ; o, si desea solicitar permiso para llamar a una API compatible en nombre de los usuarios, solicite los ámbitos necesarios además del profile y email ámbitos de email .

La siguiente es una solicitud de ejemplo para un código de usuario:

POST /device/code HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=CLIENT_ID&scope=email%20profile

Usando curl :

curl -d "client_id=CLIENT_ID&scope=email profile" https://oauth2.googleapis.com/device/code

La respuesta se devuelve como un objeto JSON:

{
  "device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
  "user_code" : "GQVQ-JKEC",
  "verification_url" : "https://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

Aparezca en tu aplicación del user_code y verification_url valores para el usuario, y, al mismo tiempo, sondea el inicio de sesión en el punto final especificado interval hasta que el usuario inicia sesión o el tiempo especificado por expires_in ha pasado.

Muestra el código de usuario y la URL de verificación.

Después de recibir un código de usuario y una URL de verificación del terminal del dispositivo, muéstrelos e indique al usuario que abra la URL e ingrese el código de usuario.

Los valores de verification_url y user_code están sujetas a cambio. Diseñe su interfaz de usuario de manera que pueda manejar los siguientes límites:

  • user_code debe mostrarse en un campo lo suficientemente ancho para manejar 15 caracteres de tamaño W
  • verification_url debe mostrarse en un campo lo suficientemente ancho para manejar una cadena de URL de 40 caracteres.

Ambas cadenas pueden contener cualquier carácter imprimible del juego de caracteres US-ASCII.

Cuando muestre la cadena user_code , no modifique la cadena de ninguna manera (como cambiar el caso o insertar otros caracteres de formato), porque su aplicación podría fallar si el formato del código cambia en el futuro.

Puede modificar la cadena de verification_url eliminando el esquema de la URL con fines de visualización, si así lo desea. Si lo hace, asegúrese de que su aplicación pueda manejar las variantes "http" y "https". No modifique de otra manera la cadena de verification_url .

Cuando el usuario navega a la URL de verificación, ve una página similar a la siguiente:

Conecte un dispositivo ingresando un código

Una vez que el usuario ingresa el código de usuario, el sitio de inicio de sesión de Google presenta una pantalla de consentimiento similar a la siguiente:

Ejemplo de pantalla de consentimiento para un cliente de dispositivo

Si el usuario hace clic en Permitir , su aplicación puede obtener un token de ID para identificar al usuario, un token de acceso para llamar a las API de Google y un token de actualización para adquirir nuevos tokens.

Obtenga un token de ID y actualice el token

Después de que su aplicación muestre el código de usuario y la URL de verificación, comience a sondear el punto final del token ( https://oauth2.googleapis.com/token ) con el código del dispositivo que recibió del punto final del dispositivo. Sondear el punto final del token en el intervalo, en segundos, especificado por el valor del interval .

La siguiente es una solicitud de ejemplo:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0

Usando curl :

curl -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0" https://oauth2.googleapis.com/token

Si el usuario aún no ha aprobado la solicitud, la respuesta es la siguiente:

{
  "error" : "authorization_pending"
}

Su aplicación debe repetir estas solicitudes a una velocidad que no exceda el valor del interval . Si su aplicación sondea demasiado rápido, la respuesta es la siguiente:

{
  "error" : "slow_down"
}

Una vez que el usuario inicia sesión y le otorga a su aplicación acceso a los ámbitos que solicitó, la respuesta a la próxima solicitud de su aplicación incluye un token de identificación, un token de acceso y un token de actualización:

{
  "access_token" : "ya29.AHES6ZSuY8f6WFLswSv0HZLP2J4cCvFSj-8GiZM0Pr6cgXU",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/551G1yXUqgkDGnkfFk6ZbjMMMDIMxo3JFc8lY8CAR-Q",
  "id_token": "eyJhbGciOiJSUzI..."
}

Al recibir esta respuesta, su aplicación puede decodificar el token de ID para obtener información de perfil básica sobre el usuario que inició sesión, o enviar el token de ID al servidor backend de su aplicación para autenticarse de forma segura con el servidor. Además, su aplicación puede usar el token de acceso para llamar a las API de Google que el usuario autorizó.

Los tokens de identificación y acceso tienen una vida útil limitada. Para mantener la sesión del usuario más allá de la vida útil de los tokens, almacene el token de actualización y utilícelo para solicitar nuevos tokens .

Obtener información de perfil de usuario del token de ID

Puede obtener información de perfil sobre el usuario que inició sesión decodificando el token de ID con cualquier biblioteca de decodificación JWT . Por ejemplo, usando la biblioteca JavaScript Auth0 jwt-decode :

var user_profile = jwt_decode(id_token);

// The "sub" field is available on all ID tokens. This value is unique for each
// Google account and can be used to identify the user. (But do not send this
// value to your server; instead, send the whole ID token so its authenticity
// can be verified.)
var user_id = user_profile["sub"];

// These values are available when you request the "profile" and "email" scopes.
var user_email = user_profile["email"];
var email_verified = user_profile["email_verified"];
var user_name = user_profile["name"];
var user_photo_url = user_profile["picture"];
var user_given_name = user_profile["given_name"];
var user_family_name = user_profile["family_name"];
var user_locale = user_profile["locale"];

Más información