Autenticar usuarios mediante Firebase

En esta página se describe cómo admitir la autenticación de usuarios en Cloud Endpoints.

Para autenticar a un usuario, una aplicación cliente debe enviar un JSON Web Token (JWT) en el encabezado de autorización de la solicitud HTTP a tu API backend. El proxy de servicios extensible (ESP) valida el token en nombre de tu API, por lo que no tienes que añadir ningún código en tu API para procesar la autenticación. Sin embargo, debes configurar tu documento de OpenAPI para que admita los métodos de autenticación que elijas.

ESP valida un JWT de forma eficiente mediante las claves públicas del emisor del JWT. ESP almacena en caché las claves públicas durante cinco minutos. Además, el ESP almacena en caché los JWT validados durante cinco minutos o hasta que caduquen, lo que ocurra primero.

Antes de empezar

  • Añade el código de autenticación a tu aplicación cliente siguiendo la documentación de autenticación de Firebase. Firebase admite la autenticación mediante contraseñas, números de teléfono y proveedores de identidades federadas populares, como Google, Facebook y Twitter.

  • Cuando tu aplicación cliente envía una solicitud HTTP, el encabezado de autorización de la solicitud debe contener las siguientes reclamaciones de JWT:
    • iss (emisor)
    • sub (asunto)
    • aud (audiencia)
    • iat (emitido a las)
    • exp (hora de vencimiento)

Configurar el documento OpenAPI

Debes tener un objeto security requirement y un objeto security definitions en tu documento de OpenAPI para que ESP valide las reclamaciones del JWT firmado.

Para admitir la autenticación de Firebase, haz lo siguiente:

  1. Añade lo siguiente a la definición de seguridad de tu documento OpenAPI:

      securityDefinitions:
        firebase:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          # Replace YOUR-PROJECT-ID with your project ID
          x-google-issuer: "https://securetoken.google.com/YOUR-PROJECT-ID"
          x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
          x-google-audiences: "YOUR-PROJECT-ID"
    
  2. Añade una sección de seguridad a nivel de API para aplicarla a toda la API o a nivel de método para aplicarla a un método específico.

      security:
        - firebase: []
    

Puedes definir varias definiciones de seguridad en el documento de OpenAPI, pero cada definición debe tener un emisor diferente. Si usas secciones de seguridad tanto a nivel de API como a nivel de método, los ajustes a nivel de método anulan los ajustes a nivel de API.

También puedes personalizar las ubicaciones de JWT añadiendo x-google-extensions. Para obtener más información, consulta las extensiones de OpenAPI.

Hacer una llamada autenticada a una API de Endpoints

Cuando envías una solicitud con un token de autenticación, por motivos de seguridad, te recomendamos que lo incluyas en el encabezado Authorization:Bearer. Por ejemplo:

curl -H "Authorization: Bearer ${TOKEN}" "${ENDPOINTS_HOST}/echo"

Aquí, ENDPOINTS_HOST y TOKEN son variables de entorno que contienen tu nombre de host de la API y tu token de autenticación, respectivamente. Consulta Hacer una solicitud autenticada a una API de Endpoints para ver un ejemplo de código que envía una solicitud mediante el encabezado Authorization:Bearer.

Si no puedes usar el encabezado al enviar la solicitud, puedes incluir el token de autenticación en un parámetro de consulta llamado access_token. Por ejemplo:

curl "${ENDPOINTS_HOST}/echo?access_token=${TOKEN}"

Recibir resultados autenticados en tu API

Normalmente, los ESP reenvían todos los encabezados que reciben. Sin embargo, anula el encabezado Authorization original cuando la dirección del backend se especifica mediante x-google-backend en la especificación de OpenAPI o BackendRule en la configuración del servicio gRPC.

El ESP enviará el resultado de la autenticación en el X-Endpoint-API-UserInfo a la API backend. Te recomendamos que uses este encabezado en lugar del encabezado Authorization original. Este encabezado es una cadena que base64url codifica un objeto JSON. El formato de objeto JSON es diferente en ESPv2 y ESP. En ESPv2, el objeto JSON es exactamente la carga útil del JWT original. En el caso de los ESPs, el objeto JSON usa nombres de campo diferentes y coloca la carga útil del JWT original en el campo claims. Consulta Gestionar JWTs en el servicio backend para obtener más información sobre el formato.

Siguientes pasos