Para admitir el flujo implícito de OAuth 2.0, tu servicio pone a disposición un extremo de autorización a través de HTTPS. Este extremo es responsable de la autenticación y de obtener el consentimiento de los usuarios para acceder a los datos. El extremo de autorización presenta una IU de acceso a los usuarios que aún no accedieron y registra el consentimiento para el acceso solicitado.
Cuando una aplicación de Google necesita llamar a una de las APIs autorizadas de tu servicio, Google usa este endpoint para obtener permiso de tus usuarios para llamar a estas APIs en su nombre.
Vinculación de la Cuenta de Google: flujo implícito de OAuth
En el siguiente diagrama de secuencia, se detallan las interacciones entre el usuario, Google y los extremos de tu servicio.
Funciones y responsabilidades
En la siguiente tabla, se definen los roles y las responsabilidades de los actores en el flujo implícito de OAuth de la vinculación de la Cuenta de Google (GAL). Ten en cuenta que, en GAL, Google actúa como el cliente de OAuth, mientras que tu servicio actúa como el proveedor de identidad o servicio.
| Actor / Componente | Rol de GAL | Responsabilidades |
|---|---|---|
| App o servidor de Google | Cliente de OAuth | Inicia el flujo, recibe el token de acceso a través de un redireccionamiento del navegador y lo almacena de forma segura para acceder a las APIs de tu servicio. |
| Tu extremo de autorización | Servidor de autorización | Autentica a tus usuarios, obtiene su consentimiento y emite tokens de acceso de larga duración directamente a Google. |
| URI de redireccionamiento de Google | Extremo de devolución de llamada | Recibe el redireccionamiento del usuario desde tu servicio de autorización con los valores access_token y state en el fragmento de URL. |
Una sesión típica del flujo implícito de OAuth 2.0 iniciada por Google tiene el siguiente flujo:
- Google abre tu extremo de autorización en el navegador del usuario. El usuario accede, si aún no lo hizo, y le otorga permiso a Google para acceder a sus datos con tu API, si aún no lo hizo.
- Tu servicio crea un token de acceso y se lo devuelve a Google. Para ello, redirecciona el navegador del usuario a Google con el token de acceso adjunto a la solicitud.
- Google llama a las APIs de tu servicio y adjunta el token de acceso con cada solicitud. Tu servicio verifica que el token de acceso otorgue autorización a Google para acceder a la API y, luego, completa la llamada a la API.
Receta de implementación
Sigue estos pasos para implementar el flujo implícito.
Paso 1: Controla las solicitudes de autorización
Cuando Google inicia la vinculación de la cuenta, redirecciona al usuario a tu extremo de autorización. Para obtener información detallada sobre los contratos de protocolo y los requisitos de parámetros, consulta el extremo de autorización.
Para controlar la solicitud, realiza las siguientes acciones:
Valida la solicitud:
- Confirma que el valor de
client_idcoincida con el ID de cliente asignado a Google. - Confirma que
redirect_uricoincida con la URL de redireccionamiento de Google esperada:none https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID - Verifica que
response_typeseatoken.
- Confirma que el valor de
Autentica al usuario:
- Verifica si el usuario accedió a tu servicio.
- Si el usuario no accedió, pídele que complete tu flujo de acceso o registro.
Genera un token de acceso:
- Crea un token de acceso único y no adivinable asociado con el usuario y el cliente.
Redirige a Google:
- Redirecciona el navegador a la URL proporcionada en
redirect_uri. - Agrega los siguientes parámetros al fragmento de URL (hash):
access_token: Es el token de acceso que generaste.token_type: Debe serbearer.state: Es el valor de estado sin modificar que se recibió de Google.
- Redirecciona el navegador a la URL proporcionada en
Controla las solicitudes userinfo
El extremo userinfo es un recurso protegido de OAuth 2.0 que muestra reclamos sobre el usuario vinculado. La implementación y el alojamiento del extremo userinfo son opcionales, excepto en los siguientes casos de uso:
- Acceso a la cuenta vinculada con Google One Tap.
- Suscripción sin inconvenientes en Android TV.
Una vez que el token de acceso se recupera correctamente del extremo del token, Google envía una solicitud al extremo userinfo para recuperar la información básica de perfil del usuario vinculado.
| Encabezados de la solicitud del extremo userinfo | |
|---|---|
Authorization header |
El token de acceso del tipo portador. |
Por ejemplo, si el extremo userinfo está disponible en
https://myservice.example.com/userinfo, una solicitud podría verse de la siguiente manera:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
Para que tu extremo userinfo controle las solicitudes, sigue estos pasos:
- Extrae el token de acceso del encabezado de autorización y muestra la información del usuario asociada con el token de acceso.
- Si el token de acceso no es válido, muestra un error HTTP 401 No autorizado con el encabezado de respuesta
WWW-Authenticate. A continuación, se muestra un ejemplo de una respuesta de error de userinfo: Si se muestra una respuesta de error 401 No autorizado o cualquier otra respuesta de error no exitosa durante el proceso de vinculación, el error no se podrá recuperar, el token recuperado se descartará y el usuario deberá volver a iniciar el proceso de vinculación.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
Si el token de acceso es válido, devuelve una respuesta HTTP 200 con el siguiente objeto JSON en el cuerpo del protocolo HTTPS respuesta:
Si el extremo userinfo muestra una respuesta exitosa HTTP 200, el token y las reclamaciones recuperados se registran con la Cuenta de Google del usuario.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }respuesta del extremo userinfo subUn ID único que identifica al usuario en tu sistema. emailDirección de correo electrónico del usuario. given_nameOpcional: Es el nombre del usuario. family_nameOpcional: Apellido del usuario. nameOpcional: Es el nombre completo del usuario. pictureOpcional: Foto de perfil del usuario.