Envío de notificaciones push con Firebase Cloud Messaging (FCM) usando .NET Core 🚀

Firebase Cloud Messaging (FCM) de Google es un servicio que permite enviar notificaciones push a aplicaciones móviles, aplicaciones web y otros dispositivos conectados.

FCM ofrece una API HTTP que permite enviar mensajes desde servidores backend hacia dispositivos cliente de forma segura y escalable.

Las notificaciones pueden enviarse utilizando tres tipos principales de destino.


Tipos de destino de notificaciones en FCM

1️⃣ Token de dispositivo (Device Token)

Permite enviar una notificación directamente a un dispositivo específico.

Cada instalación de una aplicación genera un token único proporcionado por FCM. Este token identifica la instancia de la aplicación en ese dispositivo.

El backend puede almacenar este token para enviar notificaciones personalizadas.


2️⃣ Tema (Topic)

Los topics permiten enviar notificaciones a múltiples dispositivos usando un modelo publisher–subscriber.

Los dispositivos se suscriben a un topic y cualquier mensaje enviado a ese topic será recibido por todos los dispositivos suscritos.

Ejemplo de topics:

news
promotions
weather_alerts

3️⃣ Condicional

Las notificaciones condicionales permiten definir expresiones lógicas para enviar mensajes a múltiples topics.

Ejemplo:

'news' in topics && 'mexico' in topics

Esto enviará la notificación únicamente a dispositivos suscritos a ambos topics.


Autenticación con Firebase Cloud Messaging

Para enviar notificaciones usando la API HTTP v1 es necesario autenticarse usando OAuth2 mediante una cuenta de servicio de Google.

Crear la cuenta de servicio

  1. Ir a Firebase Console
  2. Abrir Project Settings
  3. Seleccionar Service Accounts
  4. Generar una nueva clave privada
  5. Descargar el archivo:
serviceAccount.json

Este archivo contiene las credenciales necesarias para autenticarse contra la API de FCM.


Obtener un Access Token usando Google CLI

Una forma sencilla de probar las notificaciones es obtener un Access Token temporal con la CLI de Google.

Activar la cuenta de servicio:

gcloud auth activate-service-account --key-file="tu-service-account.json"

Obtener el access token:

gcloud auth print-access-token

Este token se utiliza en las peticiones HTTP como un Bearer Token.


Enviar una notificación con curl o Postman

Ejemplo de petición usando curl:

curl --location --globoff 'https://fcm.googleapis.com/v1/projects/{{project_id}}/messages:send' \
--header 'Authorization: Bearer {{access_token}}' \
--header 'Content-Type: application/json' \
--data '{
"message": {
"token": "{{device_token}}",
"notification": {
"title": "Prueba desde Postman",
"body": "Prueba desde Postman"
},
"data": {
"accion": "test",
"id": "123"
},
"android": {
"priority": "HIGH"
},
"apns": {
"headers": {
"apns_priority": "10"
},
"payload": {
"aps": {
"sound": "default",
"contentAvailable": 1
}
}
}
}
}'

Campos importantes:

CampoDescripción
notificationInformación visible de la notificación
dataDatos personalizados enviados a la aplicación
tokenToken del dispositivo destino
topicTopic de destino
android / apnsConfiguración específica por plataforma

Enviar notificaciones desde .NET Core

En aplicaciones .NET Core / .NET 8 / .NET 9 podemos utilizar la API HTTP v1 de FCM usando las librerías de autenticación de Google.

Paquetes NuGet necesarios

--Requerido
Google.Apis.Auth

--Opcionales, para un cliente de alto nivel
FirebaseAdmin
FirebaseAdmin.Messaging

También se puede usar directamente HttpClient, como en el siguiente ejemplo.


Ejemplo: aplicación de consola en .NET

// Program.cs (.NET 8/9)using Google.Apis.Auth.OAuth2;
using System.Net.Http.Headers;
using System.Net.Http.Json;// Configuración
const string projectId = "TU_PROJECT_ID";
const string deviceToken = "TU_DEVICE_TOKEN";
const string topic = "news";// Obtener credenciales desde GOOGLE_APPLICATION_CREDENTIALS
GoogleCredential credential = await GoogleCredential
.GetApplicationDefaultAsync();credential = credential.CreateScoped(
"https://www.googleapis.com/auth/cloud-platform");// Obtener access token
var accessToken = await credential
.UnderlyingCredential
.GetAccessTokenForRequestAsync();using var http = new HttpClient();http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);var url = $"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send";// Ejemplo 1: enviar a un device token
var payloadToToken = new
{
message = new
{
token = deviceToken,
notification = new
{
title = "Hola desde .NET",
body = "Este es un mensaje de prueba vía FCM"
},
data = new
{
accion = "abrir_detalle",
id = "12345"
},
android = new
{
priority = "HIGH"
}
}
};// Ejemplo 2: enviar a un topic
var payloadToTopic = new
{
message = new
{
topic = topic,
notification = new
{
title = "Noticia",
body = "Nueva actualización disponible"
},
data = new
{
tipo = "update",
version = "2.0"
}
}
};// Elegir payload
var body = payloadToToken;var response = await http.PostAsJsonAsync(url, body);var responseText = await response.Content.ReadAsStringAsync();Console.WriteLine($"Status: {response.StatusCode}");
Console.WriteLine(responseText);

Ejecutar la aplicación

Primero configura la variable de entorno con el archivo de credenciales.

Windows

set GOOGLE_APPLICATION_CREDENTIALS=C:\ruta\clave.json

Linux / macOS

export GOOGLE_APPLICATION_CREDENTIALS=/ruta/clave.json

Luego ejecuta la aplicación:

dotnet run

Si todo está configurado correctamente, FCM devolverá una respuesta similar a:

{
"name":"projects/mi-proyecto/messages/0:1700000000000000%abcdef"
}

Esto indica que el mensaje fue aceptado por Firebase.


Conclusión

Firebase Cloud Messaging permite implementar fácilmente un sistema de notificaciones push escalable para aplicaciones móviles y web.

Utilizando la API HTTP v1 y OAuth2, es posible enviar notificaciones desde cualquier backend, incluyendo aplicaciones desarrolladas con .NET Core.

Esta integración es especialmente útil para:

  • Notificaciones en tiempo real
  • Alertas del sistema
  • Mensajes promocionales
  • Actualizaciones de aplicaciones