Autoriza solicitudes de envío

Las solicitudes enviadas a FCM desde el servidor de apps o el entorno de confianza se deben autorizar. Ten en consideración las siguientes diferencias importantes entre la autorización mediante la API de HTTP heredada y la API de HTTP v1:

  • La API de HTTP v1 de FCM autoriza solicitudes con un token de acceso OAuth 2.0 de corta duración. Para crear este token, en los entornos de servidor de Google, puedes usar la credencial predeterminada de la aplicación o también obtener las credenciales obligatorias de forma manual desde un archivo de claves privadas JSON generado para una cuenta de servicio. Si usas el SDK de Admin para enviar mensajes, la biblioteca es quien administra el token por ti.
  • Los protocolos heredados solo pueden usar claves de API de larga duración que se obtienen desde Firebase console.

Autoriza solicitudes de envío HTTP v1

Según los detalles de tu entorno de servidor, usa una combinación de las siguientes estrategias para autorizar las solicitudes de servidor a los servicios de Firebase:

  • Credenciales predeterminadas de la aplicación (ADC) de Google
  • El archivo JSON de una cuenta de servicio
  • Un token de acceso OAuth 2.0 de larga duración de una cuenta de servicio

Si tu aplicación se ejecuta en Compute Engine, Kubernetes Engine, App Engine o Cloud Functions (incluido Cloud Functions para Firebase), usa el servicio de credenciales predeterminadas de la aplicación (ADC). ADC utiliza tu cuenta de servicio predeterminada existente para obtener credenciales y autorizar las solicitudes, y también permite pruebas locales flexibles mediante la variable de entorno GOOGLE_APPLICATION_CREDENTIALS. Para la automatización más completa del flujo de autorización, usa ADC y las bibliotecas de servidor del SDK de Admin.

Si tu aplicación no se ejecuta en un entorno de servidor de Google, necesitarás descargar un archivo JSON de la cuenta de servicio desde tu proyecto de Firebase. Puedes usar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS para autorizar solicitudes con las credenciales obtenidas de forma manual, siempre y cuando tengas acceso a un sistema de archivos que contenga el archivo de claves privadas. Si no cuentas con ese acceso, deberás hacer referencia al archivo de la cuenta de servicio en tu código. Este proceso debe realizarse con mucho cuidado debido al riesgo de exponer tus credenciales.

Proporciona credenciales con ADC

El servicio de credenciales predeterminadas de la aplicación (ADC) de Google revisa tus credenciales en el siguiente orden:

  1. ADC verifica si se configuró la variable de entorno GOOGLE_APPLICATION_CREDENTIALS. Si está configurada, ADC usa el archivo de cuenta de servicio al que apunta la variable.

  2. Si no se configuró la variable de entorno, ADC usará la cuenta de servicio predeterminada que Compute Engine, Kubernetes Engine, App Engine y Cloud Functions proporcionan para las aplicaciones que se ejecutan en esos servicios.

  3. Si ADC no puede usar ninguna de las credenciales ya mencionadas, el sistema emitirá un error.

El siguiente ejemplo de código del SDK de Admin muestra esta estrategia. Este ejemplo no especifica las credenciales de aplicación de forma explícita. Sin embargo, ADC puede encontrar las credenciales implícitamente, siempre y cuando se haya configurado la variable de entorno o la aplicación se ejecute en Compute Engine, Kubernetes Engine, App Engine o Cloud Functions.

Node.js

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
});

Java

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.getApplicationDefault())
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);

Python

default_app = firebase_admin.initialize_app()

Go

app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
	log.Fatalf("error initializing app: %v\n", err)
}

C#

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.GetApplicationDefault(),
});

Proporciona credenciales de forma manual

Los proyectos de Firebase son compatibles las cuentas de servicio de Google, por lo que puedes llamar a las API del servidor de Firebase desde tu servidor de apps o un entorno de confianza. Si desarrollas código de manera local, implementas tu aplicación de manera local o implementas en una nube distinta de Google Cloud que no es compatible con el servicio de credenciales predeterminadas de la aplicación (ADC), puedes usar credenciales obtenidas por la cuenta de servicio para autorizar solicitudes del servidor.

Para autenticar una cuenta de servicio y autorizar su acceso a los servicios de Firebase, debes generar un archivo de claves privadas en formato JSON.

Sigue estos pasos a fin de generar un archivo de claves privadas para tu cuenta de servicio:

  1. En Firebase Console, abre Configuración > Cuentas de servicio.

  2. Haz clic en Generar nueva clave privada y, luego, en Generar clave para confirmar.

  3. Almacena de forma segura el archivo JSON que contiene la clave. Necesitas este archivo para poder autorizar las solicitudes de servicio de forma manual.

Cuando autorices mediante una cuenta de servicio, tienes dos opciones para proporcionar las credenciales a tu aplicación. Puedes configurar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS o puedes pasar la ruta a la clave de la cuenta de servicio en el código de forma explícita. Recomendamos enfáticamente que uses la primera opción, ya que es más segura.

Para configurar la variable de entorno, haz lo siguiente:

Configura la variable de entorno GOOGLE_APPLICATION_CREDENTIALS para la ruta del archivo JSON que contiene la clave de tu cuenta de servicio. Esta variable solo se aplica en tu sesión actual de Cloud Shell, por tanto, si abres una sesión nueva, configura nuevamente la variable.

Linux o macOS

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Windows

Con PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"

Luego de haber completado los pasos mencionados, el servicio de credenciales predeterminadas de aplicación (ADC) pueden determinar de forma implícita tus credenciales, lo que te permite usar credenciales de cuenta de servicio cuando haces pruebas o ejecutas en entornos de terceros.

Usa credenciales para crear tokens de acceso

Si utilizas métodos de envío del SDK de Admin, en que los tokens se controlan automáticamente, necesitarás crear el token de acceso y agregarlo para enviar solicitudes.

Para recuperar el token de acceso OAuth 2.0 de corta duración, usa las credenciales de Firebase y la biblioteca cliente de la API de Google en tu lenguaje preferido, y haz referencia al archivo JSON de la clave privada como se muestra a continuación:

node.js

 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

Cuando venza el token de acceso, se llamará a su método de actualización automáticamente para obtener un token actualizado.

Para autorizar el acceso a FCM, solicita el alcance https://www.googleapis.com/auth/firebase.messaging.

Para agregar el token de acceso a un encabezado de solicitud HTTP:

Agrega el token como el valor del encabezado Authorization en el formato Authorization: Bearer <access_token>:

node.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Python

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

Java

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

Autoriza las solicitudes de envío del protocolo heredado

Con el protocolo HTTP heredado, cada solicitud debe contener la clave de servidor, disponible en la pestaña Cloud Messaging del panel Configuración de Firebase console. En el caso del protocolo XMPP, debes usar la misma clave de servidor para establecer una conexión.

Autoriza solicitudes HTTP

Una solicitud de mensaje tiene dos partes: el encabezado HTTP y el cuerpo HTTP. El encabezado HTTP debe contener los siguientes encabezados:

  • Authorization: key=YOUR_SERVER_KEY
    Asegúrate de que esta sea la clave de servidor, cuyo valor está disponible en la pestaña Cloud Messaging del panel Configuración de Firebase console. FCM rechaza las claves de Android, iOS y del navegador.
  • Content-Type: application/json para JSON; application/x-www-form-urlencoded;charset=UTF-8 para texto sin formato.
    Si se omite Content-Type, se asume que el formato es de texto sin formato.

Por ejemplo:

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

Consulta Compilar solicitudes de envío para ver detalles completos sobre la creación de solicitudes de envío. La referencia del protocolo HTTP heredado proporciona una lista de todos los parámetros que puede contener tu mensaje.

Cómo verificar la validez de una clave de servidor

Si recibes errores de autenticación cuando envías mensajes, verifica la validez de tu clave de servidor. Por ejemplo, en Linux, ejecuta el siguiente comando:

api_key=YOUR_SERVER_KEY

curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"registration_ids\":[\"ABC\"]}"

Si recibes un código de estado HTTP 401, tu clave de servidor no es válida.

Autoriza una conexión XMPP

Con XMPP, puedes mantener una conexión continua, asíncrona y bidireccional con los servidores de FCM. La conexión se puede usar para enviar y recibir mensajes entre tu servidor y los dispositivos conectados con FCM de tus usuarios.

Puedes usar la mayoría de las bibliotecas XMPP para administrar una conexión a FCM de larga duración. El extremo XMPP se ejecuta en fcm-xmpp.googleapis.com:5235. Cuando pruebes la funcionalidad con usuarios fuera de producción, en su lugar debes conectarte al servidor de preproducción fcm-xmpp.googleapis.com:5236 (ten en cuenta que el puerto es diferente).

Hacer pruebas habituales en la preproducción (un entorno más pequeño donde se ejecutan las últimas compilaciones de FCM) permite aislar a los usuarios reales del código de prueba. Los dispositivos de prueba y el código de prueba que se conectan a fcm-xmpp.googleapis.com:5236 deberían usar un ID de emisor de FCM diferente para evitar enviar mensajes de prueba a usuarios de producción o enviar mensajes ascendentes desde el tráfico de producción mediante conexiones de prueba.

La conexión tiene dos requisitos importantes:

  • Debes iniciar una conexión de seguridad de la capa de transporte (TLS, Transport Layer Security). Ten en cuenta que FCM no es compatible con la extensión STARTTLS actualmente.
  • FCM necesita un mecanismo de autenticación SASL PLAIN que use <your_FCM_Sender_Id>@gcm.googleapis.com (el ID de remitente de FCM) y la clave de servidor como contraseña. Estos valores están disponibles en la pestaña Cloud Messaging en el panel Configuración de Firebase console.

Si en algún momento la conexión falla, debes volver a conectarte inmediatamente. No es necesario retirarse después de una desconexión que se produzca tras la autenticación. Para cada ID de remitente, FCM permite 1,000 conexiones en paralelo.

Los siguientes fragmentos muestran cómo ejecutar la autenticación y la autorización para una conexión XMPP a FCM.

Servidor XMPP

El servidor XMPP solicita una conexión a FCM

<stream:stream to="gcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

FCM abre la conexión y solicita un mecanismo de autenticación, incluido el método PLAIN.

<stream:features>
  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    <mechanism>X-OAUTH2</mechanism>
    <mechanism>X-GOOGLE-TOKEN</mechanism>
    <mechanism>PLAIN</mechanism>
  </mechanisms>
</stream:features>

Servidor XMPP

El servidor XMPP debe responder con el método de autenticación PLAIN y proporcionar la clave de servidor, disponible en la pestaña Cloud Messaging del panel Configuración de Firebase console.

<auth mechanism="PLAIN"
xmlns="urn:ietf:params:xml:ns:xmpp-sasl">MTI2MjAwMzQ3OTMzQHByb2plY3RzLmdjbS5hb
mFTeUIzcmNaTmtmbnFLZEZiOW1oekNCaVlwT1JEQTJKV1d0dw==</auth>

FCM

<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>

Servidor XMPP

<stream:stream to="gcm.googleapis.com"
        version="1.0" xmlns="jabber:client"
        xmlns:stream="http://etherx.jabber.org/streams">

FCM

<stream:features>
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
  <session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>
</stream:features>

Servidor XMPP

<iq type="set">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"></bind>
</iq>

FCM

<iq type="result">
  <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
    <jid>SENDER_ID@gcm.googleapis.com/RESOURCE</jid>
  </bind>
</iq>

Nota: FCM no usa el recurso vinculado mientras enruta mensajes.

Consulta Compilar solicitudes de envío para ver detalles completos sobre la creación de solicitudes de envío. La referencia del protocolo XMPP heredado proporciona una lista de todos los parámetros que puede contener tu mensaje.

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.