Project/Error Handling

네이버 SENS Service 문자인증 구현 에러

디스페어 2023. 2. 9.

문제 1. 로직 자체는 돌아가지만 문자가 발송되지 않는 현상

const secret_key = require("../../config/ncpSens");
const { response, errResponse } = require("../../config/response");
const baseResponse = require("../../config/baseResponseStatus");

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);

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: `${secret_key.NCP_call_number}`,
      content: `전송할 문자`,
      messages: [
        {
          to: `${phoneNumber}`,
        },
      ],
    },
  })
    .then(function (res) {
      res.send(response(baseResponse.NCP_SMS_SUCCESS));
    })
    .catch((err) => {
      // console.log("에러빔", err);
      if (err.res === undefined) {
        res.send(response(baseResponse.NCP_SMS_SUCCESS));
      } else res.send(errResponse(baseResponse.NCP_SMS_FAILURE));
    });
};

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.NCP_SMS_AUTHENTICATION_FAILED));
  } else if (CacheData !== verifyCode) {
    return res.send(errResponse(baseResponse.NCP_SMS_AUTHENTICATION_FAILED));
  } else {
    Cache.del(phoneNumber);
    return res.send(response(baseResponse.NCP_SMS_VERIFY_SUCCESS));
  }
};

 

로직엔 이상이 없지만 휴대전화에 가입된 부가서비스 때문에 발생된 에러였다

코드의 뼈대는 다른 블로그에서 줍줍했다 기분 굿 ^오^

 

바로 요거!

 

네이버 콘솔창에서 출력한 값을 볼 때 발신번호 변작 방지에 해당할 경우인데

 

SK기준 바로 요놈이 범인이다

 

저놈을 해지해주면 된다

 

코드만 정상적으로 동작한다면 네이버 콘솔로그에서 친절하게 알려주기때문에

이 외에도 뭐가 문제인지 바로 확인 가능하다

 

 

 

해결 1. 그치만 해지하긴 싫은데 어떻함?

그럴 경우 팀원한테 네이버 콘솔창에서 프로젝트 만들고 키값 다 내놔! 하면 된다 ^오^

 Naver Cloud SENS Service는 한달 50건 무료 & 초과 시 건당 9원 가량이라 개발단계 테스트용도론 꽤 쓸만하다

 

 

 

Reference

[Cloud] SENS Service를 이용한 문자 인증 API 구현하기

반응형

댓글