Autorizar enviar solicitudes

Las solicitudes enviadas a FCM desde su servidor de aplicaciones o entorno confiable deben estar autorizadas. Tenga en cuenta estas importantes diferencias entre la API HTTP heredada en desuso y la autorización de la API HTTP v1:

  • La API FCM HTTP v1 autoriza solicitudes con un token de acceso OAuth 2.0 de corta duración. Para acuñar este token, puede utilizar las credenciales predeterminadas de la aplicación de Google (en entornos de servidor de Google) y/u obtener manualmente las credenciales requeridas de un archivo de clave privada JSON generado para una cuenta de servicio. Si utiliza el SDK de administración de Firebase para enviar mensajes, la biblioteca maneja el token por usted.
  • Los protocolos heredados obsoletos solo pueden usar claves API de larga duración obtenidas de Firebase console.

Autorizar solicitudes de envío HTTP v1

Dependiendo de los detalles de su entorno de servidor, use una combinación de estas estrategias para autorizar solicitudes de servidor a los servicios de Firebase:

  • Credenciales predeterminadas de aplicaciones de Google (ADC)
  • Un archivo JSON de cuenta de servicio
  • Un token de acceso OAuth 2.0 de corta duración derivado de una cuenta de servicio

Si su aplicación se ejecuta en Compute Engine, Google Kubernetes Engine, App Engine o Cloud Functions (incluidas Cloud Functions para Firebase), use las credenciales predeterminadas de la aplicación (ADC). ADC utiliza su cuenta de servicio predeterminada existente para obtener credenciales para autorizar solicitudes, y ADC permite pruebas locales flexibles a través de la variable de entorno GOOGLE_APPLICATION_CREDENTIALS . Para lograr la máxima automatización del flujo de autorización, utilice ADC junto con las bibliotecas del servidor Admin SDK.

Si su aplicación se ejecuta en un entorno de servidor que no es de Google , deberá descargar un archivo JSON de cuenta de servicio desde su proyecto de Firebase. Siempre que tenga acceso a un sistema de archivos que contenga el archivo de clave privada, puede utilizar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS para autorizar solicitudes con estas credenciales obtenidas manualmente. Si no tiene acceso a dicho archivo, debe hacer referencia al archivo de la cuenta de servicio en su código, lo cual debe hacerse con extremo cuidado debido al riesgo de exponer sus credenciales.

Proporcionar credenciales mediante ADC

Las Credenciales predeterminadas de la aplicación (ADC) de Google verifican sus credenciales en el siguiente orden:

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

  2. Si la variable de entorno no está configurada, ADC usa la cuenta de servicio predeterminada que Compute Engine, Google 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 anteriores, el sistema genera un error.

El siguiente ejemplo de código del SDK de administración ilustra esta estrategia. El ejemplo no especifica explícitamente las credenciales de la aplicación. Sin embargo, ADC puede encontrar implícitamente las credenciales siempre que la variable de entorno esté configurada o siempre que la aplicación se ejecute en Compute Engine, Google Kubernetes Engine, App Engine o Cloud Functions.

Nodo.js

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

Java

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

FirebaseApp.initializeApp(options);

Pitón

default_app = firebase_admin.initialize_app()

Ir

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(),
});

Proporcionar credenciales manualmente

Los proyectos de Firebase admiten cuentas de servicio de Google, que puedes usar para llamar a las API del servidor de Firebase desde tu servidor de aplicaciones o entorno confiable. Si está desarrollando código localmente o implementando su aplicación localmente, puede usar las credenciales obtenidas a través de esta cuenta de servicio para autorizar las solicitudes del servidor.

Para autenticar una cuenta de servicio y autorizarla a acceder a los servicios de Firebase, debe generar un archivo de clave privada en formato JSON.

Para generar un archivo de clave privada para su cuenta de servicio:

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

  2. Haga clic en Generar nueva clave privada y luego confirme haciendo clic en Generar clave .

  3. Almacene de forma segura el archivo JSON que contiene la clave.

Al realizar la autorización a través de una cuenta de servicio, tiene dos opciones para proporcionar las credenciales a su aplicación. Puede configurar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS o puede pasar explícitamente la ruta a la clave de la cuenta de servicio en el código. La primera opción es más segura y muy recomendable.

Para configurar la variable de entorno:

Establezca la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta del archivo JSON que contiene su clave de cuenta de servicio. Esta variable solo se aplica a su sesión actual de Shell, por lo que si abre una nueva sesión, configure la variable nuevamente.

Linux o macOS

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

ventanas

Con PowerShell:

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

Una vez que haya completado los pasos anteriores, las Credenciales predeterminadas de la aplicación (ADC) pueden determinar implícitamente sus credenciales, lo que le permite utilizar las credenciales de la cuenta de servicio al realizar pruebas o ejecutarlas en entornos que no son de Google.

Utilice credenciales para acuñar tokens de acceso

A menos que esté utilizando el SDK de administración , que maneja la autorización automáticamente, deberá generar el token de acceso y agregarlo para enviar solicitudes.

Utilice sus credenciales de Firebase junto con la biblioteca de autenticación de Google para su idioma preferido para recuperar un token de acceso OAuth 2.0 de corta duración:

nodo.js

 function getAccessToken() {
  return new Promise(function(resolve, reject) {
    const key = require('../placeholders/service-account.json');
    const 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);
    });
  });
}

En este ejemplo, la biblioteca cliente API de Google autentica la solicitud con un token web JSON o JWT. Para obtener más información, consulte Tokens web JSON .

Pitón

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

  :return: Access token.
  """
  credentials = service_account.Credentials.from_service_account_file(
    'service-account.json', scopes=SCOPES)
  request = google.auth.transport.requests.Request()
  credentials.refresh(request)
  return credentials.token

Java

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refresh();
  return googleCredentials.getAccessToken().getTokenValue();
}

Una vez que caduque su token de acceso, se llama automáticamente al método de actualización del token para recuperar un token de acceso actualizado.

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

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

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

nodo.js

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

Pitón

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 " + getServiceAccountAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

Autorizar solicitudes de envío de protocolo heredado

Con el protocolo heredado HTTP, cada solicitud debe contener la clave del servidor de la pestaña Mensajería en la nube del panel Configuración de Firebase console. Para XMPP, debe utilizar la misma clave de servidor para establecer una conexión.

Migrar claves de servidor heredadas

A partir de marzo de 2020, FCM dejó de crear claves de servidor heredadas. Las claves de servidor heredadas existentes seguirán funcionando, pero te recomendamos que utilices la versión más reciente de la clave denominada Clave de servidor en Firebase console .

Si desea eliminar una clave de servidor heredada existente, puede hacerlo en la consola de Google Cloud .

Autorizar solicitudes HTTP

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

  • Authorization : clave=YOUR_SERVER_KEY
    Asegúrese de que esta sea la clave del servidor , cuyo valor está disponible en la pestaña Mensajería en la nube del panel Configuración de Firebase console. FCM rechaza las claves de Android, plataforma Apple y 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 supone que el formato es texto sin formato.

Por ejemplo:

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

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

Consulte Crear solicitudes de envío para obtener detalles completos sobre cómo crear solicitudes de envío. La referencia del protocolo HTTP heredado proporciona una lista de todos los parámetros que puede contener su mensaje.

Comprobar la validez de una clave de servidor

Si recibe errores de autenticación al enviar mensajes, verifique la validez de su clave de servidor. Por ejemplo, en Linux, ejecute 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 recibe un código de estado HTTP 401, su clave de servidor no es válida.

Autorizar una conexión XMPP

Con XMPP, puede mantener una conexión bidireccional, asincrónica y persistente con los servidores FCM. La conexión se puede utilizar para enviar y recibir mensajes entre su servidor y los dispositivos conectados a FCM de sus usuarios.

Puede utilizar la mayoría de las bibliotecas XMPP para administrar una conexión duradera a FCM. El punto final XMPP se ejecuta en fcm-xmpp.googleapis.com:5235 . Al probar la funcionalidad con usuarios que no son de producción, debe conectarse al servidor de preproducción en fcm-xmpp.googleapis.com:5236 (tenga en cuenta el puerto diferente).

Las pruebas periódicas en preproducción (un entorno más pequeño donde se ejecutan las últimas compilaciones de FCM) son beneficiosas para 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 deben usar un ID de remitente de FCM diferente para evitar cualquier riesgo de enviar mensajes de prueba a usuarios de producción o enviar mensajes ascendentes desde el tráfico de producción a través de conexiones de prueba.

La conexión tiene dos requisitos importantes:

  • Debe iniciar una conexión de Seguridad de la capa de transporte (TLS). Tenga en cuenta que FCM actualmente no admite la extensión STARTTLS .
  • FCM requiere un mecanismo de autenticación SASL PLAIN utilizando <your_FCM_Sender_Id>@fcm.googleapis.com ( ID del remitente de FCM) y la clave del servidor como contraseña. Estos valores están disponibles en la pestaña Mensajería en la nube del panel Configuración de Firebase console.

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

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

servidor XMPP

El servidor XMPP solicita una conexión a FCM

<stream:stream to="fcm.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 utilizando el método de autenticación PLAIN , proporcionando la clave del servidor desde la pestaña Mensajería en la nube 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="fcm.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@fcm.googleapis.com/RESOURCE</jid>
  </bind>
</iq>

Nota: FCM no utiliza el recurso vinculado al enrutar mensajes.

Consulte Crear solicitudes de envío para obtener detalles completos sobre cómo crear solicitudes de envío. La referencia del protocolo XMPP heredado proporciona una lista de todos los parámetros que puede contener su mensaje.