반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- jQuery
- 한번에 체크
- sql 서버
- 깜빡임
- CheckAllChildNodes
- C#
- 비교
- 윈폼
- input
- 로깅
- header
- 초기설정
- footer
- ejs
- 깃허브
- MSSQL
- nodejs
- SSMS
- SQL Server
- html 코드
- WinForm
- checkbox
- Compare
- github
- treeview
- ChatGPT
- json
- Git
- body
- 하위노드
Archives
- Today
- Total
타닥타닥 민타쿠
AWS Cognito user pools(사용자 풀) 사용법 본문
반응형
Nodejs 환경 기준으로 작성하지만, 혹여 다른 환경일지라도 아마존 코그니토 사용자 풀을 처음 써보려는 사람에게는 이 글이 분명 도움될 것이라 생각한다.
처음부터 끝까지 세세한 설명보다는, 길어보이지만 짧은 이 글을 읽고 나면 스스로 코그니토 API 를 찾고 사용하여 개발할 수 있게끔 설명하는 것이 목적이다.
생각보다 자세하거나 쉽게 설명한 글이 보이지 않아서 직접 알아보고 시행 착오를 겪으며 시작이 오래 걸렸지만, 이 글을 읽는 누군가는 금방 시작할 수 있다거나, 한줄기 희망으로 느껴졌으면 한다.
참고로 sns 연동은 다루지 않았다. 추후에 이를 다룬 포스팅을 업로드할 생각은 있다.
기본 사용 환경 구축
- AWS Cognito user pools(사용자 풀) 생성
- 링크 참조 : (코그니토 사용자 풀 생성 가이드 페이지) - 사용자 풀 정보 확인
- 사용자 풀 ID, (사용자 풀 ID에 포함된)지역을 확인한다.
- 클라이언트 ID 를 확인한다.
- AWS 계정 액세스 키 생성 및 정보 확인
- 액세스 키를 생성하면 한번만 다운로드 받을 수 있다. 분실할 경우, 새 액세스 키를 만들어 사용해야 한다.
- '액세스 키 ID' 와 ‘액세스 키’ 를 확인한다. - 프로젝트 내에 npm 모듈 설치
- npm install aws-sdk
- npm install jwk-to-pem
- npm install jsonwebtoken
- npm install request - npm 모듈 import
const AWS = require("aws-sdk"); const jwkToPem = require('jwk-to-pem'); const jwt = require('jsonwebtoken'); const request = require('request');
- 계정, 사용자 풀 접근 정보 저장
- 암호화 후, 별도 저장이 더 좋은 방법으로 보이나, 우선 코드 내 상수로 저장하였다.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*******';
- 접근 정보 설정 업데이트 및 CognitoIdentityServiceProvider 생성
REST API 사용법
- API Documents 확인
- 링크 참조 : (코그니토 API 문서 페이지) - 원하는 기능 조회
- Actions 페이지 혹은 좌측 내비게이션 바에서 원하는 항목을 찾거나, 상단 검색창에서 검색한다.
- 관리자의 사용자 생성 기능을 예로, AdminCreateUser 를 조회할 수 있다. ‘create user’ 등의 검색어로 검색해서 찾을 수도 있다. - 기능 확인
- 조회한 api 가 원하던 기능인지 확인한다. 페이지 첫 문단이 해당 api 에 대한 설명이므로, 읽어보며 생각했던 기능이 맞는지 확인해야 한다. - 특성 및 속성 확인
- 페이지 우측에 내비게이션 바가 생긴 것을 알 수 있다.
- Request Syntax : 요청 구문의 형식을 확인할 수 있다.
- Request Parameters : 요청 구문에 들어가는 속성의 형식과 필수 여부를 확인할 수 있다.
- Response Syntax : 응답 구문의 형식을 확인할 수 있다.
- Response Elements : 성공시 응답 요소가 무엇인지 확인할 수 있다.
- Errors : 발생하는 Exception을 확인하여 에러 처리를 할 수 있다. - api 사용
cognitoIdentityServiceProvider.<API이름>(<API의 Request Syntax 객체>,function(err,data){ if(err) { console.log(err); } else { console.log(data); } });
- 실제 사용
//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:'계정 생성 안내 이메일이 발송되었습니다.'}); } }); }); });
- 에러 처리에 관한 참고 사항
- API Document 에서 Errors 항목을 보면 Exception 을 확인하여 에러 처리를 할 수 있다고 언급하였다.
- 위와 같이 Documents에 나오는 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:'비밀번호가 변경되었습니다.'}); } });
앞서 api 사용법 설명을 위해 예를 들었던 ‘AdminCreateUser’ 같은 경우는, 같은 Exception 코드에서도 다른 경우를 구분해야 원하는 처리를 할 수 있었다.- 이처럼 err.code(Exception 코드) 가 아닌 err.message(에러 메세지)로 구분하여 처리를 해야할 수도 있다. 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