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 ser capaz de 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.
Obtener un ID 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 puntos finales de inicio de sesión de Google.
Para encontrar el ID de cliente y el secreto de cliente de su proyecto, haga lo siguiente:
- Seleccione una credencial de OAuth 2.0 existente o abra la página Credenciales .
- 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 proporcionando la información necesaria para crear las credenciales.
- Busque el ID de cliente en la sección ID de cliente de OAuth 2.0 . Para obtener más información, haga clic en el ID del cliente.
Si está creando una nueva ID de cliente, seleccione el tipo de aplicación TV 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 que los usuarios inicien sesión con sus cuentas de Google, solicite solo los ámbitos de profile
y email
; o, si desea solicitar permiso para llamar a una API admitida en nombre de los usuarios, solicite los ámbitos necesarios además del profile
y los ámbitos de email
.
El siguiente es un ejemplo de solicitud de 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
}
Su aplicación muestra los valores de user_code
y verification_url
al usuario y, al mismo tiempo, sondea el extremo de inicio de sesión en el interval
especificado hasta que el usuario inicie sesión o haya transcurrido el tiempo especificado por expires_in
.
Mostrar 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 sujetos a cambios. Diseñe su interfaz de usuario de una manera que pueda manejar los siguientes límites:
-
user_code
debe mostrarse en un campo lo suficientemente ancho como para manejar caracteres de 15W
de tamaño. -
verification_url
debe mostrarse en un campo lo suficientemente amplio como para manejar una cadena de URL de 40 caracteres de longitud.
Ambas cadenas pueden contener cualquier carácter imprimible del conjunto de caracteres US-ASCII.
Cuando muestre la cadena de user_code
de usuario, 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 URL 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". De lo contrario, no modifique la cadena de verification_url
.
Cuando el usuario navega a la URL de verificación, ve una página similar a la siguiente:
Después de 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:
Si el usuario hace clic en Permitir , su aplicación puede obtener un token de identificación 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.
Obtener un token de identificación y un token de actualización
Después de que su aplicación muestre el código de usuario y la URL de verificación, comience a sondear el extremo del token ( https://oauth2.googleapis.com/token
) con el código del dispositivo que recibió del extremo del dispositivo. Sondee el extremo del token en el intervalo, en segundos, especificado por el valor del interval
.
El siguiente es un ejemplo de solicitud:
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 supere el valor de 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 otorga a su aplicación acceso a los ámbitos que solicitó, la respuesta a la siguiente solicitud de su aplicación incluye un token de ID, 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 manera segura con el servidor. Además, su aplicación puede usar el token de acceso para llamar a las API de Google que autorizó el usuario.
Los identificadores y los tokens de acceso tienen una duración 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 del 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 de 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"];