개발로그/플러터 전화 기능 구현
[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
}