0.0.2 • Published 2 years ago

nice-api-node v0.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

nice-api-node

NICE API 서비스를 Node.js에서 사용하기 위한 라이브러리 구현체 입니다. 현재 NICE 본인 확인 (통합형, API를 통한 NICE 표준창 호출) 서비스가 구현되어 있습니다. 추후 필요에 따라 다른 서비스도 추가할 예정입니다. PR은 언제나 환영합니다.

📌 NICE 본인 확인 (통합형, API를 통한 NICE 표준창 호출)

flow.png

NICE에서 제공된 흐름도를 참고하여 다음 기능이 내부적으로 구현되어 있고

  • 인증 기관 토큰 (AccessToken) 발급
  • 암호화 토큰 (CryptoToken) 발급
  • 대칭키 생성
  • 인증 요청 데이터 암호화 (AES128/CBC/PKCS7)
  • 인증 결과 데이터 복호화

다음 기능을 외부로 제공합니다.

  • 표준창 서비스 호출시 필요한 요청 데이터 생성 ( generateRequestData )
  • 본인 인증 결과로 받은 암호화된 데이터 복호화 ( decryptResultData )

📦 설치방법

$ npm install nice-auth-node
or
$ yarn add nice-auth-node

🚀 사용 방법

라이브러리 초기화

// import
const { NiceAuth, NiceAuthError } = require('nice-api-node')

// NICE에서 제공된 clientId, clientSecret, productId로 NiceAuth 인스턴스 생성
const niceAuth = new NiceAuth({
    clientId: '<client id>',
    clientSecret: '<client secret>',
    productId: '<product id>'
})

NICE 표준창을 호출하기 위한 요청데이터 생성

try {
    const requestData = await niceAuth.generateRequestData({
        requestno: '123456789', // 최대 30자
        returnurl: 'http://localhost:3000/test',
        authtype: 'M',
        methodtype: 'post',
        popupyn: 'Y',
        receivedata: JSON.stringify({ foo: 'var' }),
    });
    console.log(requestData);
} catch (e) {
    // 오류 처리
    if (e instanceof NiceAuthError.AccessTokenError) {
        console.log('액세스 토큰 발급 실패!');
    } else if (e instanceof NiceAuthError.CryptoTokenError) {
        console.log('암호화 토큰 발급 실패!');
    } else if (e instanceof NiceAuthError.SymmetricKeyError) {
        console.log('대칭키 생성 실패!');
    } else if (e instanceof NiceAuthError.EncryptDataError) {
        console.log('요청 데이터 암호화 실패!');
    } else if (e instanceof NiceAuthError.IntegrityValueError) {
        console.log('무결성 검증 값 생성 실패!');
    } else {
        console.log('기타 오류')
    }
}

generateRequestData 함수 호출 파라미터

항목필수타입길이고정값설명
requestnoYString30서비스 요청 고유 번호
returnurlYString250인증 결과를 받을 URL
authtypeNString1인증수단 고정 (M:휴대폰인증,C:카드본인확인인증,X:인증서인증,U:공동인증서인증,F:금융인증서인증,S:PASS인증서인증)
mobilcecoNString1이통사 우선 선택(S : SKT, K : KT, L : LGU+)
businessnoNString10사업자번호(법인인증인증에 한함)
methodtypeNString3~4post,get결과 URL 전달시 http method타입
popupynNString1Y, N팝업
receivedataNString-인증 후 전달받을 데이터 세팅 (요청값 그대로 리턴)

generateRequestData 호출 결과

{
  symmetricKey: 'symmetric key value', // symmetricKey는 노출이 안되도록 서버 어딘가에 저장
  formData: {
    tokenVersionId: 'tokenVersionId value',
    encData: 'encData value',
    integrityValue: 'integrityValue value',
  }
}

generateRequestData의 결과를 사용하여 다음과 같은 형태로 form을 생성하고 submit하여 사용자 본인 인증 시작

<form name="form" id="form" action="https://nice.checkplus.co.kr/CheckPlusSafeModel/service.cb">
  <input type="hidden" id="m" name="m" value="service" />
  <input type="hidden" id="token_version_id" name="token_version_id" value="tokenVersionId" />
  <input type="hidden" id="enc_data" name="enc_data" value="encData" />
  <input type="hidden" id="integrity_value" name="integrity_value" value="integrityValue" />
</form>

사용자가 본인 인증을 완료하면 generateRequestData 호출 시 넘겼던 returnurl로 다음 데이터가 넘어옴

{
  "token_version_id": "value",
  "enc_data": "value",
  "integrity_value": "value"
}

사용자 본인 인증 결과로 받은 암호화된 데이터를 복호화 하기 위해 decryptResultData 호출

try {
    // 서버 어딘가에 저장된 symmetricKey
    const symmetricKey = keyStorage.get('requestNo');

    // 사용자 본인 인증 결과
    const authResultData = {
        token_version_id: 'value',
        enc_data: 'value',
        integrity_value: 'value',
    };

    const decryptedData = niceAuth.decryptResultData({
        symmetricKey: symmetricKey,
        integrityValue: authResultData.integrity_value,
        cipherData: authResultData.enc_data,
    });

    console.log(decryptedData);
} catch (e) {
    if (e instanceof NiceAuthError.DecryptDataError) {
        console.log('데이터 복호화 실패');
    } else {
        console.log('another');
    }
}

인증결과 데이터

항목필수타입길이설명
resultcodeYString4결과코드
requestnoYString30요청 고유 번호(회원사에서 전달보낸 값)
enctimeYString14암호화 일시(YYYYMMDDHH24MISS)
sitecodeYString16사이트코드
responsenoYString24응답고유번호
authtypeYString1인증수단
nameNString100이름
utf8_nameNStringUTF8로 URLEncoding된 이름 값
birthdateNString8생년월일 8자리
genderNString1성별
nationalinfoNString1내외국인
mobile_coNString1이통사 구분(휴대폰 인증 시)
mobile_noNString1휴대폰 번호(휴대폰 인증 시)
ciNString88개인 식별 코드(CI)
diNString64개인 식별 코드(DI)
businessnoNString10사업자번호(법인인증서 인증시)
receivedataNString요청 시 전달 받은 RECEIVEDATA

서비스 키 확인 방법

img.png

img_1.png

img_2.png

img_3.png