Entérate de todos los anuncios de Firebase Summit y descubre cómo Firebase puede ayudarte a acelerar el desarrollo de las apps y a ejecutarlas con confianza. Más información

Autorizar enviar solicitudes

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

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

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

Autorizar solicitudes de envío HTTP v1

Según 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 la aplicación de Google (ADC)
  • Un archivo JSON de cuenta de servicio
  • Un token de acceso de 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 usa su cuenta de servicio predeterminada existente para obtener credenciales para autorizar solicitudes, y ADC habilita pruebas locales flexibles a través de la variable de entorno GOOGLE_APPLICATION_CREDENTIALS . Para la automatización más completa del flujo de autorización, use 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 de su proyecto de Firebase. Siempre que tenga acceso a un sistema de archivos que contenga el archivo de clave privada, puede usar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS para autorizar solicitudes con estas credenciales obtenidas manualmente. Si no tiene dicho acceso al archivo, debe hacer referencia al archivo de la cuenta de servicio en su código, lo que debe hacerse con sumo cuidado debido al riesgo de exponer sus credenciales.

Proporcione credenciales usando ADC

Las credenciales predeterminadas de la aplicación de Google (ADC) 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 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()

Vamos

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 puede usar para llamar a las API del servidor de Firebase desde su servidor de aplicaciones o entorno de confianza. 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, abra Configuración > Cuentas de servicio .

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

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

Al autorizar 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 se recomienda encarecidamente.

Para establecer la variable de entorno:

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

Linux o mac OS

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 usar las credenciales de la cuenta de servicio cuando realiza pruebas o se ejecuta en entornos que no son de Google.

Use credenciales para acuñar tokens de acceso

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

Use sus credenciales de Firebase junto con la biblioteca de autenticación de Google de su idioma preferido para recuperar un token de acceso de 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 de la 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.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

Una vez que caduca su token de acceso, se llama automáticamente al método de actualización de 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 el valor del encabezado de 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 " + getAccessToken());
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 Cloud Messaging del panel Configuración de Firebase console. Para XMPP, debe usar 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 le recomendamos que, en su lugar, use la versión más reciente de la clave etiquetada Clave de servidor en la consola de Firebase .

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

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 = SU_SERVIDOR_CLAVE
    Asegúrese de que esta sea la clave del servidor , cuyo valor está disponible en la pestaña Cloud Messaging 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 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 su mensaje.

Comprobación de 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 de FCM. La conexión se puede usar para enviar y recibir mensajes entre su servidor y los dispositivos conectados a FCM de sus usuarios.

Puede usar la mayoría de las bibliotecas XMPP para administrar una conexión de larga duración a FCM. El punto final de 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 una 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 es compatible con la extensión STARTTLS .
  • FCM requiere un mecanismo de autenticación SASL PLAIN usando <your_FCM_Sender_Id>@fcm.googleapis.com (FCM remitente ID ) y la clave del servidor como contraseña. Estos valores están disponibles en la pestaña Cloud Messaging del panel Configuración de Firebase console.

Si en algún momento la conexión falla, debe volver a conectarse inmediatamente. No hay necesidad de 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 mediante el método de autenticación PLAIN , proporcionando la clave del servidor desde la pestaña Cloud Messaging del panel de 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 usa el recurso vinculado al enrutar mensajes.

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