본문 바로가기

백엔드

[네이버 클라우드 플랫폼]본인인증 Rest API 구현

반응형

 https://www.ncloud.com

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

 

콘솔로 이동한다.

 

 

https://apidocs.ncloud.com/ko/ai-application-service/sens/sms_v2/

 

헤더의 경우 access key가 일단 필요해보인다.

클라우드 포탈 - 마이페이지 - 계정관리 - 인증키관리 - Acess Key ID

 

 

우리가 알아놔야 할 것은,

포탈에서의 인증키 관리 부분의

'Access Key'와 'Secret Key' 값이다

잘 정리해두자.

 

 

이제 보니 헤더 id는 찾았고,

경로변수에 들어갈 서비스 아이디를 가져와야 한다.

 

 

SENS(Simple Easy Notification Service)에 들어왔다면

'프로젝트 생성하기'를 눌러준다.

 

 

원하는 프로젝트를 선정 후 생성해준다.

나는 문자를 보낼 거라서 하나만 체크해줬다.

 

 

프로젝트 - 서비스 ID 키 아이콘 을 클릭하면

서비스ID를 확인할 수 있다.

 

 

이제 번호를 보낼

발신번호를 등록해준다.

 

이제 코드 수정을 해주고,

request를 보내보면 문자 발송이 잘 된다.

 

 

route 부분

 

userRoute.js

app.post('/send', user.send);
app.post('/verify', user.verify);

 

userController.js

const app = require('express').Router();
const axios = require('axios');
const Cache = require('memory-cache');
const request = require('request');
const CryptoJS = require('crypto-js');

const NCP_serviceID = '[[서비스 아이디]]';
const NCP_accessKey = '[[액세스 키]]';
const NCP_secretKey = '[[포털에 있던 비밀키]]';

const date = Date.now().toString();
const uri = NCP_serviceID;
const secretKey = NCP_secretKey;
const accessKey = 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);

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: '01033543945',
        content: `[본인 확인] 인증번호 [${verifyCode}]를 입력해주세요.`,
        messages: [
          {
            to: `${phoneNumber}`,
          },
        ],
      }, 
      // function(err, res, html) {
        // if(err) console.log(err);
        // else {
          // resultCode = 200;
          // console.log(html);
        // }
      })
    .then(function (res) {
      console.log('response',res.data, res['data']);
      res.json({isSuccess: true, code: 202, message: "본인인증 문자 발송 성공", result: res.data });
    })
    .catch((err) => {
      console.log(err.res);
      if(err.res == undefined){
        res.json({isSuccess: true, code: 200, message: "본인인증 문자 발송 성공", result: res.data });
      }
      else res.json({isSuccess: true, code: 204, message: "본인인증 문자 발송에 문제가 있습니다.", result: err.res });
    });
};

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('fail');
    } else if (CacheData !== verifyCode) {
      return res.send('fail');
    } else {
      Cache.del(phoneNumber);
      return res.send('success');
      
    }
  };
반응형