개발로그/플러터 전화 기능 구현

[node.js] 아고라 토큰 발급 서버 만들기

황진수 2024. 12. 13. 00:40

통화 기능 구현 시 아고라를 사용하기로 했다.

 

통화를 할 때는 매번 토큰을 발급해줘야 하는데, 이때 노드를 사용해서 서버를 만들어 토큰 발급을 진행해준다.

 

 

1. 프로젝트 환경 설정

Node.js 프로젝트를 초기화한다.

$ mkdir agora-token-server
$ cd agora-token-server
$ npm init -y

 

필요한 패키지를 설치한다.

$ npm install express cors body-parser agora-access-token dotenv

2. Express 서버 생성

원하는 에디터(nano, vim, etc...)를 이용해 server.js 파일을 생성한다.

const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const { RtcTokenBuilder, RtcRole } = require('agora-access-token');

const app = express();
const PORT = process.env.PORT || 3000;
const HOST = '0.0.0.0'; // 모든 네트워크 인터페이스에서 요청 수락

app.use(cors());
app.use(bodyParser.json());

app.get('/', (req, res) => {
  res.send('Agora Token Server is running.');
});

app.post('/rtc/token', (req, res) => {
  const { channelName, uid, role, expireTime } = req.body;

  if (!channelName) {
    return res.status(400).json({ error: 'Channel name is required' });
  }

  const appId = <App ID 값>;
  const appCertificate = <App certificate 값>;

  if (!appId || !appCertificate) {
    return res.status(500).json({ error: 'App ID or App Certificate is missing' });
  }

  const currentTimestamp = Math.floor(Date.now() / 1000);
  const privilegeExpireTime = currentTimestamp + (expireTime || 3600);

  const token = RtcTokenBuilder.buildTokenWithUid(
    appId,
    appCertificate,
    channelName,
    uid || 0,
    role === 'publisher' ? RtcRole.PUBLISHER : RtcRole.SUBSCRIBER,
    privilegeExpireTime
  );

  return res.json({ token });
});

app.listen(PORT, HOST, () => {
  console.log(`Server is running on http://${HOST}:${PORT}`);
});

 

App ID와 App certificate는 여기서 확인하면 된다.


추가 기능) 보안 기능 강화

만약 보안 기능을 강화하고 싶다면 dotenv를 이용할 수도 있다.

 

dotenv를 설치해준다.

$ npm install dotenv

 

만약 깃허브를 사용 중이면 .gitignore에 .env를 설정해준다. (매우 중요!)

*.env

 

같은 위치에 .env 파일을 생성하고 다음과 같이 입력해준다.

APP_ID=<App ID 값>
APP_CERTIFICATE=<App Certificate 값>
PORT=<포트 번호>

 

서버 코드에서는 주석으로 표시한 부분을 수정/추가 해주면 된다.

const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const { RtcTokenBuilder, RtcRole } = require('agora-access-token');
require('dotenv').config(); // .env 파일 로드

const app = express();
const PORT = process.env.PORT || 3000;
const HOST = '0.0.0.0';

app.use(cors());
app.use(bodyParser.json());

app.get('/', (req, res) => {
  res.send('Agora Token Server is running.');
});

app.post('/rtc/token', (req, res) => {
  const { channelName, uid, role, expireTime } = req.body;

  if (!channelName) {
    return res.status(400).json({ error: 'Channel name is required' });
  }

  const appId = process.env.APP_ID; // dotenv를 통한 변수 값 지정
  const appCertificate = process.env.APP_CERTIFICATE; // dotenv를 통한 변수 값 지정

  if (!appId || !appCertificate) {
    return res.status(500).json({ error: 'App ID or App Certificate is missing' });
  }

  const currentTimestamp = Math.floor(Date.now() / 1000);
  const privilegeExpireTime = currentTimestamp + (expireTime || 3600);

  const token = RtcTokenBuilder.buildTokenWithUid(
    appId,
    appCertificate,
    channelName,
    uid || 0,
    role === 'publisher' ? RtcRole.PUBLISHER : RtcRole.SUBSCRIBER,
    privilegeExpireTime
  );

  return res.json({ token });
});

app.listen(PORT, HOST, () => {
  console.log(`Server is running on http://${HOST}:${PORT}`);
});

3. 서버 실행 및 테스트

서버를 실행한다.

$ node server.js

 

포스트맨을 통해 테스트를 해보면 값이 잘 받아지는 것을 확인할 수 있다.

{
  "channelName": "testChannel",
  "uid": 12345,
  "role": "publisher",
  "expireTime": 3600
}