You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js服务器中实现Firebase HTTP v1动态令牌向Flutter应用发推送

使用Node.js实现Firebase HTTP v1版本的动态通知服务

核心逻辑

Firebase HTTP v1接口依赖OAuth2授权令牌,令牌有效期为1小时。我们需要通过缓存令牌+自动刷新的方式,实现无需手动干预的动态令牌管理,避免每次请求都重复获取令牌。

步骤1:准备Firebase服务账号密钥

从Firebase控制台下载服务账号JSON文件,保存到Node.js项目目录中(例如命名为service-account.json)。

步骤2:实现令牌的自动获取与缓存

编写一个独立模块管理令牌生命周期,缓存当前有效令牌及过期时间,请求时自动判断是否需要刷新:

const fs = require('fs');
const { google } = require('googleapis');

// 加载服务账号密钥
const serviceAccount = JSON.parse(fs.readFileSync('service-account.json'));

// 缓存令牌与过期时间
let cachedToken = null;
let tokenExpiryTime = 0;

async function getAccessToken() {
  const now = Date.now();
  // 提前5分钟刷新令牌,避免请求时刚好过期
  if (cachedToken && now < tokenExpiryTime - 5 * 60 * 1000) {
    return cachedToken;
  }

  const jwtClient = new google.auth.JWT(
    serviceAccount.client_email,
    null,
    serviceAccount.private_key,
    ['https://www.googleapis.com/auth/firebase.messaging'],
    null
  );

  const { token, expiry_date } = await jwtClient.authorize();
  cachedToken = token;
  tokenExpiryTime = expiry_date;
  return token;
}

module.exports = { getAccessToken };

步骤3:实现动态发送通知的函数

调用令牌管理模块获取有效令牌,再向Firebase v1 API发送通知请求:

const axios = require('axios');
const { getAccessToken } = require('./token-manager');

// 替换为你的Firebase项目ID
const PROJECT_ID = 'your-firebase-project-id';

async function sendNotification(deviceToken, title, body) {
  const accessToken = await getAccessToken();
  const apiUrl = `https://fcm.googleapis.com/v1/projects/${PROJECT_ID}/messages:send`;

  const requestPayload = {
    message: {
      token: deviceToken,
      notification: {
        title: title,
        body: body
      }
      // 可添加data字段传递自定义业务数据
    }
  };

  try {
    const response = await axios.post(apiUrl, requestPayload, {
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      }
    });
    console.log('通知发送成功:', response.data);
    return response.data;
  } catch (error) {
    console.error('通知发送失败:', error.response?.data || error.message);
    throw error;
  }
}

// 示例调用:sendNotification('用户设备令牌', '测试标题', '测试内容');
module.exports = { sendNotification };

关键细节说明

  • 依赖安装:执行npm install googleapis axios安装所需依赖包
  • 缓存策略:提前5分钟刷新令牌,避免请求过程中令牌过期导致失败
  • 错误处理:捕获令牌获取、API请求阶段的异常,便于排查问题
  • 动态化实现:调用sendNotification时无需关心令牌状态,模块会自动处理有效期判断与刷新

测试验证

可以基于Express编写一个测试接口:

const express = require('express');
const { sendNotification } = require('./fcm-service');
const app = express();
app.use(express.json());

app.post('/send-notification', async (req, res) => {
  const { deviceToken, title, body } = req.body;
  try {
    const result = await sendNotification(deviceToken, title, body);
    res.status(200).json({ success: true, data: result });
  } catch (error) {
    res.status(500).json({ success: false, error: error.message });
  }
});

app.listen(3000, () => {
  console.log('服务器运行在端口3000');
});

启动服务后,通过Postman向http://localhost:3000/send-notification发送POST请求,携带设备令牌、标题和内容即可测试通知发送功能。

内容的提问来源于stack exchange,提问作者rohitrai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:25:04