[Naver Cloud] SENS Service를 이용한 문자 인증 API 구현
개요
Naver Cloud의 서비스 중 하나인 SENS(Simple & Easy Notification Service)를 이용하여 문자 인증 API를 구현한다.
목차
소개
1. NAVER CLOUD PLATFORM 회원가입 및 기본 프로젝트 생성
먼저 위의 링크로 이동하여 NAVER CLOUD PLATFORM에 회원가입을 진행하여준다. 그 후 마이페이지에 들어가, 서비스를 이용하기 위해서 결제 수단을 등록하여 준다.
그 후, 위의 네모박스 안의 Simple & Easy Notification Service를 클릭하여 이동하여, 새로운 프로젝트를 생성하여준다.
프로젝트의 생성을 완료 하였으면, SMS 문자를 보낼 발신번호를 등록하여준다.
2. API Url 및 요청 헤더에 필요한 정보 저장
API Url 및 Header에 담아야 할 정보는 위와 같다.
header 정보의 x-ncp-iam-access-key를 위해 마이페이지-계정관리-인증키 관리로 이동하여서 위의 Access Key 및 Secret Key를 확인한다.
API 접근을 위해 주소로 사용 할 수 있는 Service의 ID를 다음과 같이 확인하여준다.
3. Node.js 파일 작성
a. userRoute.js
const user = require('./userController');
// 문자인증(SENS를 통한) 전송 API
app.post('/app/send', user.send);
// 문자인증(SENS를 통한) 검증 API
app.post('/app/verify', user.verify);
b. userController.js
const secret_key = require("../../../config/secret_sms");
const axios = require('axios');
const Cache = require('memory-cache');
const CryptoJS = require('crypto-js');
const date = Date.now().toString();
const uri = secret_key.NCP_serviceID;
const secretKey = secret_key.NCP_secretKey;
const accessKey = secret_key.NCP_accessKey;
const method = 'POST';
const space = " ";
const newLine = "\n";
const url = `https://sens.apigw.ntruss.com/sms/v2/services/${uri}/messages`;
const url2 = `/sms/v2/services/${uri}/messages`;
const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey);
hmac.update(method);
hmac.update(space);
hmac.update(url2);
hmac.update(newLine);
hmac.update(date);
hmac.update(newLine);
hmac.update(accessKey);
const hash = hmac.finalize();
const signature = hash.toString(CryptoJS.enc.Base64);
header의 x-ncp-apigw-signature-v2 속성을 위해, 다음과 같이 시그니쳐 생성을 위한 모듈 및 변수들을 선언하여준다. 이 때 설치되어 있지 않은 모듈들은 npm install [모듈이름]을 통해 설치 할 수 있다. 또한 이때의 secretKey 및 accessKey는 중요한 정보이므로, config 아래의 파일에 다음과 같이 입력하여주었다.
NCP_serviceID: 위에서 발급받은 Service의 ID
NCP_accessKey: 마이페이지-인증키 관리에서 얻은 Access Key ID
NCP_secretKey: Access Key ID 옆의 Secret Key
※send 함수 (인증문자 발송)※
exports.send = async function (req, res) {
const phoneNumber = req.body.phoneNumber;
Cache.del(phoneNumber);
//인증번호 생성
const verifyCode = Math.floor(Math.random() * (999999 - 100000)) + 100000;
Cache.put(phoneNumber, verifyCode.toString());
axios({
method: method,
json: true,
url: url,
headers: {
'Content-Type': 'application/json',
'x-ncp-iam-access-key': accessKey,
'x-ncp-apigw-timestamp': date,
'x-ncp-apigw-signature-v2': signature,
},
data: {
type: 'SMS',
contentType: 'COMM',
countryCode: '82',
from: '발신번호 ex)01012341234',
content: `[Milli] 인증번호 [${verifyCode}]를 입력해주세요.`,
messages: [
{
to: `${phoneNumber}`,
},
],
},
})
.then(function (res) {
res.send(response(baseResponse.SMS_SEND_SUCCESS));
})
.catch((err) => {
if(err.res == undefined){
res.send(response(baseResponse.SMS_SEND_SUCCESS));
}
else res.sned(errResponse(baseResponse.SMS_SEND_FAILURE));
});
};
※verify 함수 (인증문자 검증)※
exports.verify = async function (req, res) {
const phoneNumber = req.body.phoneNumber;
const verifyCode = req.body.verifyCode;
const CacheData = Cache.get(phoneNumber);
if (!CacheData) {
return res.send(errResponse(baseResponse.FAILURE_SMS_AUTHENTICATION));
} else if (CacheData !== verifyCode) {
return res.send(errResponse(baseResponse.FAILURE_SMS_AUTHENTICATION));
} else {
Cache.del(phoneNumber);
return res.send(response(baseResponse.SMS_VERIFY_SUCCESS));
}
};
4. POSTMAN 확인
다음과 같이 POSTMAN으로 전송하여 보면 성공적으로 이루어짐을 알 수 있다.
참고사이트
1. https://api.ncloud-docs.com/docs/ko/home
'Infra > Cloud' 카테고리의 다른 글
[Istio] Istio란? (0) | 2021.10.04 |
---|---|
[Service Mesh]서비스 메시란? (0) | 2021.10.04 |
[CI/CD] CI/CD(지속적 통합, 지속적 제공 및 배포) 파이프라인이란? (0) | 2021.08.12 |
[Docker & Kubernetes] 도커, 그리고 쿠버네티스 (0) | 2021.08.06 |
[Cloud] 클라우드(Cloud)란 무엇인가? (0) | 2021.08.04 |