Node.js push notification(FCM)

 

Summry

본 문서에서는 node.js에서 푸시 알림을 보내는 방법을 정리한다.

send me email if you have any questions.


FCM이란?

FCM(Firebase Cloud Messaging)은 사용자 디바이스에 설치된 앱 단위로 메시지를 전송할 수 있는 서비스로 안드로이드 푸시 알림 서비스 기능을 사용할 수 있도록 구글이 제공하는 무료 푸시 서버이다.

용어 설명
클라이언트 앱(Client App) 안드로이드 단말에서 FCM을 사용하는 앱
앱 서버(App Server) 클라이언트 앱에 전달되는 토큰을 관리하고 클라이언트 앱에 메시지를 전달할 수 있도록 FCM에 메시지를 전달한다. 토큰은 FCM에서 발급해 주는 것으로 등록된 클라이언트 앱을 구분하기 위한 용도로 사용된다.
API Key(Server Key) Google Developers Console에서 발급받은 API 키로 앱 서버에 저장되어 관리되고 HTTP 프로토콜로 메시지를 보낼 때 POST의 헤더에 포함된다. 클라이언트 앱의 코드에 API 키를 포함하지 않도록 주의한다.
Sender ID FCM 앱 등록으로 발급된 google-sevices.json 파일의 project_number에 해당되는 값이다. 클라이언트 앱에서 Registration Token을 발급받기 위해 FCM에 전달하는 값으로 사용된다.
Application ID Application ID는 Android에서 Package Name을 의미한다. Package Name은 앱을 구분하는 단위로 하나의 앱은 중복되지 않은 Package Name을 가져야 한다.
Registration Token FCM에서 발급받은 토큰. 웹 서버에 전달하여 클라이언트 앱에 메시지 알림을 전송할 때 사용된다.

그림1

https://noonestaysthesame.tistory.com/m/17

push notification 전송 과정

  1. 서버에서 FCM 서버로 HTTP Request를 post 방식으로 요청하면
  2. FCM서버에서 HTTP Response 응답이 옵니다
  3. 그리고 FCM 서버에서 앱으로 메시지를 보냅니다
  4. 앱에서는 받은 메시지를 처리하고 음답 메시지를 보냅니다.

module install

$ npm install firebase-admin --save

server key download

그림2
프로젝트 설정

그림3
서비스계정 탭에서 새 비공개 키를 생성한다.

  • 다운로드 된 서버키 파일을 프로젝트 폴더에 이동시킨다.

example code

"use strict";

// Router init
const express = require("express");
const router = express.Router();
router.use(express.urlencoded({ extended: false }));
router.use(express.json());

// FCM init
const admin = require("firebase-admin");

// 서버키 파일의 경로
let serviceAccount = require("../firenotification-fd54c-firebase-adminsdk-qxgro-378402825f.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
})

// push test API
router.get('/test', (req, res, next) => {
  let idx = String(req.body.idx);
  let title = req.body.title;
  let body = req.body.body;

  let target_token =
    '토큰 값..';

  let message = {
    data: {
      title: 'test title',
      body : 'test body',
    },
    token: target_token,
  }

  admin
    .messaging()
    .send(message)
    .then(function (response) {
      res.status(200).send("push success");
      console.log('Successfully sent message: : ', response)
    })
    .catch(function (err) {
      console.log('Error Sending message!!! : ', err)
    })
})

module.exports = router;

Reference

[Node.js] [Firebase] FCM서버를 이용한 푸시 알림 보내기
[협업] 협업을 위한 푸시알림 설정하기 (feat node.js)
Firebase Cloud Messaging 이란?