반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

타닥타닥 민타쿠

AWS Cognito user pools(사용자 풀) 사용법 본문

개발/AWS

AWS Cognito user pools(사용자 풀) 사용법

민타쿠 2021. 7. 21. 00:10
반응형

Nodejs 환경 기준으로 작성하지만, 혹여 다른 환경일지라도 아마존 코그니토 사용자 풀을 처음 써보려는 사람에게는 이 글이 분명 도움될 것이라 생각한다.
처음부터 끝까지 세세한 설명보다는, 길어보이지만 짧은 이 글을 읽고 나면 스스로 코그니토 API 를 찾고 사용하여 개발할 수 있게끔 설명하는 것이 목적이다.
생각보다 자세하거나 쉽게 설명한 글이 보이지 않아서 직접 알아보고 시행 착오를 겪으며 시작이 오래 걸렸지만, 이 글을 읽는 누군가는 금방 시작할 수 있다거나, 한줄기 희망으로 느껴졌으면 한다.

참고로 sns 연동은 다루지 않았다. 추후에 이를 다룬 포스팅을 업로드할 생각은 있다.

 

기본 사용 환경 구축

  1. AWS Cognito user pools(사용자 풀) 생성
    - 링크 참조 : (코그니토 사용자 풀 생성 가이드 페이지)

  2. 사용자 풀 정보 확인
    - 사용자 풀 ID, (사용자 풀 ID에 포함된)지역을 확인한다.
    AWS - Cognito - 사용자 풀 관리 - 생성한 사용자 풀 - 일반 설정
    - 클라이언트 ID 를 확인한다.
    AWS - Cognito - 사용자 풀 관리 - 생성한 사용자 풀 - 앱 클라이언트
  3. AWS 계정 액세스 키 생성 및 정보 확인
    AWS - 내 보안 자격 증명 - 액세스 키 - 새 액세스 키 만들기
    - 액세스 키를 생성하면 한번만 다운로드 받을 수 있다. 분실할 경우, 새 액세스 키를 만들어 사용해야 한다.
    - '액세스 키 ID' 와 ‘액세스 키’ 를 확인한다.

  4. 프로젝트 내에 npm 모듈 설치
    npm install aws-sdk
    npm install jwk-to-pem
    npm install jsonwebtoken
    npm install request

  5. npm 모듈 import
    const AWS = require("aws-sdk");
    const jwkToPem = require('jwk-to-pem');
    const jwt = require('jsonwebtoken');
    const request = require('request');​


  6. 계정, 사용자 풀 접근 정보 저장
    const CLIENT_ID = '3olbmrmgsip34dtj**********';
    const ACCESS_KEY_ID = 'AKIAW5QD3C**********';
    const SECERET_ACCESS_KEY = 'VIOJgaq6WUxL1BnjENSChkmMF3sVAi**********';
    const REGION = 'ap-northeast-2';
    const USERPOOL_ID = 'ap-northeast-2_hJ*******';​
    - 암호화 후, 별도 저장이 더 좋은 방법으로 보이나, 우선 코드 내 상수로 저장하였다.

  7. 접근 정보 설정 업데이트 및 CognitoIdentityServiceProvider 생성

REST API 사용법

  1. API Documents 확인
    - 링크 참조 : (코그니토 API 문서 페이지)

  2. 원하는 기능 조회
    AWS - Documentation - Amazon Cognito - API Reference
    - Actions 페이지 혹은 좌측 내비게이션 바에서 원하는 항목을 찾거나, 상단 검색창에서 검색한다.
    - 관리자의 사용자 생성 기능을 예로, AdminCreateUser 를 조회할 수 있다. ‘create user’ 등의 검색어로 검색해서 찾을 수도 있다.

  3. 기능 확인
    AWS - Documentation - Amazon Cognito - API Reference - AdminCreateUser
    - 조회한 api 가 원하던 기능인지 확인한다. 페이지 첫 문단이 해당 api 에 대한 설명이므로, 읽어보며 생각했던 기능이 맞는지 확인해야 한다.

  4. 특성 및 속성 확인
    AWS - Documentation - Amazon Cognito - API Reference - AdminCreateUser
    - 페이지 우측에 내비게이션 바가 생긴 것을 알 수 있다.

    - Request Syntax : 요청 구문의 형식을 확인할 수 있다.
    - Request Parameters : 요청 구문에 들어가는 속성의 형식과 필수 여부를 확인할 수 있다.
    - Response Syntax : 응답 구문의 형식을 확인할 수 있다.
    - Response Elements : 성공시 응답 요소가 무엇인지 확인할 수 있다.
    - Errors : 발생하는 Exception을 확인하여 에러 처리를 할 수 있다.

  5. api 사용
    cognitoIdentityServiceProvider.<API이름>(<API의 Request Syntax 객체>,function(err,data){
      if(err)
      {
        console.log(err);
      }
      else
      {
        console.log(data);
      }
    });​


  6. 실제 사용
    //createUser
    router.post('/createUser',function(req,res){
      req.on('data', function(chunk) {
        var datalist = JSON.parse(chunk).data;
        var userName = datalist[0];
        var email = datalist[1];
        var givenName = datalist[2];
        var familyName = datalist[3];
        var phoneNumber = datalist[4];
        const createUserParams =
        {
          "UserPoolId": USERPOOL_ID,
          "DesiredDeliveryMediums": [ "EMAIL" ],
          "Username": userName,
          "UserAttributes":
          [
            {
              "Name": "email",
              "Value": email //이 메일로 인증메일이 가기 때문에 잘 적어줘야 한다.
            },
            {
              "Name": "given_name",
              "Value": givenName
            },
            {
              "Name": "family_name",
              "Value": familyName
            },
            {
              "Name": "phone_number",
              "Value": "+82"+phoneNumber
            },
            {
              "Name": "email_verified",
              "Value": "true"
            }
          ]
        };
        cognitoIdentityServiceProvider.adminCreateUser(createUserParams,function(err,data){
          if(err)
          {
            console.log(err);
            if(err.message.startsWith('User account already exists')){
              res.json({code:-1, msg:'이미 존재하는 아이디입니다.'});
            }else if(err.message.startsWith('An account with the email already exists')){
              res.json({code:-2, msg:'이미 등록된 이메일 주소입니다.'});
            }
          }
          else
          {
            console.log(data);
            res.json({code:0, msg:'계정 생성 안내 이메일이 발송되었습니다.'});
          }
        });
      });
    });​


  7. 에러 처리에 관한 참고 사항
    - API Document 에서 Errors 항목을 보면 Exception 을 확인하여 에러 처리를 할 수 있다고 언급하였다.
    cognitoIdentityServiceProvider.confirmForgotPassword(confirmForgotPwdParams, function(err,data){
      if(err)
      {
        console.log('confirmForgotPassword Err : ');
        console.log(err);
        if(err.code === 'CodeMismatchException'){
          res.json({code:-2, msg:'유효하지 않은 확인코드입니다.'});  
        }else if(err.code === 'ExpiredCodeException') {
          res.json({code:-3, msg:'만료된 확인코드입니다.'});
        }else if(err.code === 'LimitExceededException') {
          res.json({code:-4, msg:'시도 횟수 초과입니다. 나중에 다시 시도하십시오.'});
        }else {
          res.json({code:-1, msg:'비밀번호 변경에 실패하였습니다.'});
        }
      }
      else
      {
        console.log('confirmForgotPassword OK : ');
        console.log(data);
        res.json({code:0, msg:'비밀번호가 변경되었습니다.'});
      }
    });​
    - 위와 같이 Documents에 나오는 Exception 코드만으로 원하는 처리를 할 수 있는 경우도 있었지만, 
    앞서 api 사용법 설명을 위해 예를 들었던 ‘AdminCreateUser’ 같은 경우는, 같은 Exception 코드에서도 다른 경우를 구분해야 원하는 처리를 할 수 있었다.- 이처럼 err.code(Exception 코드) 가 아닌 err.message(에러 메세지)로 구분하여 처리를 해야할 수도 있다.

  8. cognitoIdentityServiceProvider.adminCreateUser(createUserParams,function(err,data){ if(err) { console.log(err); if(err.message.startsWith('User account already exists')){ res.json({code:-1, msg:'이미 존재하는 아이디입니다.'}); }else if(err.message.startsWith('An account with the email already exists')){ res.json({code:-2, msg:'이미 등록된 이메일 주소입니다.'}); } } else { console.log(data); res.json({code:0, msg:'계정 생성 안내 이메일이 발송되었습니다.'}); } });​

 

반응형
Comments