Autorizar solicitudes de envío

Las solicitudes enviadas a FCM desde el servidor de apps o el entorno de confianza se deben autorizar. La API de FCM HTTP v1 usa un token de acceso de OAuth 2.0 de corta duración que se genera para la cuenta de servicio asociada a tu proyecto de Firebase. Los protocolos heredados usan claves de API de larga duración recuperados desde Firebase console. En ambos casos, debes agregar la credencial necesaria a cada solicitud de mensaje que se envía a FCM.

Autoriza solicitudes de envío HTTP v1

Cada proyecto de Firebase tiene una cuenta de servicio predeterminada. Puedes usar esta cuenta para llamar a las API del servidor de Firebase desde tu servidor de apps o tu entorno de confianza. Si usas una cuenta de servicio diferente, asegúrate de que tenga permisos de Editor o Propietario.

Para autenticar la cuenta de servicio y autorizar su acceso a los servicios de Firebase, debes generar un archivo de clave privada en formato JSON y usar esta clave para recuperar un token de OAuth 2.0 de corta duración. Una vez que tengas un token válido, puedes agregarlo a las solicitudes de tu servidor según lo necesiten los distintos servicios de Firebase, como Remote Config o FCM.

Para generar un archivo de clave privada para tu cuenta de servicio, haz lo siguiente:

  1. En Firebase console, abre Configuración > Cuentas de servicio.
  2. Haz clic en Generar nueva clave privada y en Generar clave para confirmar.
  3. Almacena de forma segura el archivo JSON que contiene la clave. Lo necesitarás para completar el paso siguiente.

Para recuperar un token de acceso, haz lo siguiente:

Para recuperar el token, puedes usar la biblioteca de cliente de la API de Google para tu lenguaje preferido y hacer 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', FCM_SCOPE)
  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();
}

Ten en cuenta que la llamada para actualizar el token es idempotente. Una vez que el token venza, se llama al método de actualización del token automáticamente para recuperar 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 heredado HTTP, cada solicitud debe contener la clave del 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.

Autorizar 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 Android, 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 401 HTTP, 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 (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 del 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.