如何在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
相关产品推荐
相关产品推荐

