본문 바로가기
미분류

aws cognito 사용해보기 2. jets로 pre-signup lambda trigger 걸기

by 혜리루 2020. 3. 18.

제 서비스로직에는 회원가입시에(oauth기 때문에 첫 로그인) 몇가지 처리해줄 일들이 있습니다.

이를 위해서 cognito에는 로그인시, 인증시, 회원가입시 등등의 상황에서 쓸 수 있는 lambda trigger를 지원하는데요,

오늘은 ruby on jets 프레임워크를 이용해서 cognito api에 lambda 트리거를 걸어보겠습니다. 

 

먼저 lambda function을 작성해줍시다.

 

jets 에서 function은 controller나 job 등과 같은 다른 서비스들보다 제약이 덜한 대신 jets의 기능을 사용할 수 없습니다.

저는 미리 작성해 놓은 model을 사용하고싶기 때문에 먼저 jets 관련 모듈을 import 해주었습니다.

저처럼 jets의 기능을 사용하시지 않는 분들은 생략하셔도 좋습니다.

 

# app/functions/session.rb

require 'bundler/setup'
require 'jets'
Jets.once

 

그리고 google oauth를 사용하긴 하지만 회사 구성원만 서비스를 쓸 수 있도록 첫 로그인시에 메일 domain 검사를 해줄 것입니다.

# app/functions/session.rb

require 'bundler/setup'
require 'jets'
Jets.once

def pre_registration(event:, context:)
  event['response']['autoConfirmUser'] = false

  address = event['request']['userAttributes']['email'].split('@')

  if address[1] == 'deali.net'
    event['response']['autoConfirmUser'] = true
    event
  end
end

이런식으로 event hash를 통해 전달된 email 주소로를 검사하고 confirm 여부를 설정해주었습니다.

 

로그인을 해보시면 다른 도메인으로는 로그인이 불가능한 걸 확인하실 수 있습니다!

 

################# 여기서부터 실패기 ##############################

 

그리고 저는 새로운 회원들에게 emoji와 nickname을 랜덤으로 부여해주고 싶었습니다.

 

그러려면 먼저 cognito 콘솔에서 해당 속성들을 추가해줘야합니다.

user pool 관리 화면에서 general setting의 attributes 탭을 선택해줍시다.

그리고 화면 하단에서 이런식으로 커스텀 속성을 추가해줄 수 있습니다.

 

속성 명이 custom:*** 로 나타나는 점을 확인해주세요.

 

그리고 다시 function을 수정해줍시다.

 

제가 사전에 작성해둔 모델의 메소드를 통해 각각의 속성들을 설정해주었습니다. 사실 이 cognito trigger에 대한 다큐먼트가 좀 부실해서 구글링을 하면서 뇌피셜로 작성해보았습니다.

# app/functions/session.rb

require 'bundler/setup'
require 'jets'
Jets.once

def pre_registration(event:, context:)
  event['response']['autoConfirmUser'] = false

  address = event['request']['userAttributes']['email'].split('@')

  if address[1] == 'deali.net'
    event['request']['autoConfirmUser'] = true
    event['response']['userAttributes'] = {'custom:color' => Color.set_color,
                                           'custom:emoji' =>rand(51).to_s,
                                           'custom:nickname' => Nickname.set_nickname}
    event
  end
end

 

이제 function을 배포해주고 cognito 콘솔에서 trigger를 설정해줍시다.

콘솔에 보시면 general setting에 trigger라는 탭이 있습니다.

보시면 여러가지 상황에 trigger를 걸 수 있는데요, 저는 가입시에 trigger를 걸고 싶기때문에 pre sign-up에 생성한 function을 설정해주겠습니다.

 

그리고 로그인을 다시 해보면? 실패합니다.

어떻게 요청해도 실패하네요. 찾아보니 pre-signup trigger의 event 형식은

 

{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "validationData": {
            "string": "string",
            . . .
         },
        "clientMetadata": {
            "string": "string",
            . . .
         }
    },

    "response": {
        "autoConfirmUser": "boolean",
        "autoVerifyPhone": "boolean",
        "autoVerifyEmail": "boolean"
    }

이렇습니다. custom attribute를 수정할 수 있는 key가 없네요.

거의 4시간 동안 삽질을 한 결과 이 방법이 불가능하다는 사실만 깨달았습니다 ㅎㅎㅎ...

 

실패를 발판삼아 pre-signup 트리거가 아닌 새로운 방법을 찾아서 다시 글을 쓰도록 하겠습니다.

 

출처 : https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/user-pool-lambda-pre-sign-up.html

댓글