Cognito 닉네임 중복체크 하기

Seunghwa's Devlog·2022년 2월 11일
0

Amplify와 Cognito를 사용하여 회원가입을 구현하는데 있어 Username은 중복체크를 기본적으로 지원해주지만 다른 속성에 대해서는 지원해주지 않아서 직접 구현을 해 보았다.

Cognito에 존재하는 사전가입 트리거를 사용하기로 했다.
회원가입 버튼을 누르게되면 트리거를 호출하여 DB에 존재하는 닉네임과 비교를 하여 이미 존재하는 닉네임일 경우 에러메세지를 출력하고 존재하지 않는 닉네임일 경우 정상적으로 회원가입이 진행되게 하는 로직으로 구현을 하였다.

Lambda에 접속하여 "CheckNicknameAlreadyExist"라는 이름으로 함수를 생성하였다.

// 1. Define and configure packages.
const AWS = require("aws-sdk");
const dynamo = new AWS.DynamoDB.DocumentClient({ region: `your region` });
// 2. Lambda start
exports.handler = async (event, context) => {
  console.log("Processing event: %j", event);
  //3. Set our constants
  const UserObjectTableName = "Your Table Name";
  const IndexName = "Your Key Name";
  //4. Get the username from the event
  const nickname = event.request.userAttributes.nickname
  console.log("nickname from event: " + nickname);
  //5. Construct the parameters for our query
  var queryParams = {
    TableName: UserObjectTableName,
    IndexName: IndexName,
    KeyConditionExpression: "nickname = :nickname",
    ExpressionAttributeValues: {
      ":nickname": nickname
    }
  };
  try {
    //6. Check if username exists
    const res = await dynamo.query(queryParams).promise();
    //7. If the length of Items is not 0, then the nickname exists!
    if (res.Items.length !== 0) {
      throw "Nickname already exists!";
    }
    //8. Nickname doesn't exist!
    context.done(null, event);
  } catch (error) {
    //9. Handle errors
    console.log("Error!: " + error);
    return context.done(error, event)
  }
};

매개변수로 해당 리전, DB TableName, IndexName을 넣어주었다.
(DB는 dynamodb를 사용하였고, Graphql schema기준으로 설명)

주의! IndexName은 Graphql의 User Schema에서 @key directive로 중복체크하고자하는 필드와 keyName을 미리 생성하여 똑같은 keyname을 넣어주어야 한다.

type User
  @model
  @auth(
    rules: [
      { allow: public, operations: [read], provider: iam }
      { allow: private, operations: [read] }
      { allow: groups, groups: ["user", "adminUser"] }
    ]
  ) 
  @key(name: "findNickname", fields: ["nickname"], queryField:"findNickname") {
  id: ID!
  username: String!
  email: String!
  nickname: String!
  name: String!
  phone_number: String!
  vietnamDetailAddress: String!
  vietnamCity: String!
  vietnamProvince: String!
}

다음은 권한 설정을 해주면 되는데,

역할이름을 클릭하고, 권한추가 -> 인라인 정책 생성을 누른다.

서비스는 Dynamodb를 선택하고 작업은 "읽기"의 화살표를 눌러 Query를 선택한다. 리소스는 아래와 같이 넣어준다.

"arn:aws:dynamodb:ap-northeast-2:*:table/Your Table Name"
"arn:aws:dynamodb:ap-northeast-2:*:table/Your Table Name/index/findNickname"

이렇게 권한을 추가해주면 끝이다.

이제 테스트를 해보자!

DB에 이미 "seunghwa_Dev"라는 닉네임이 존재하므로 테스트는 실패한다

DB에 "Pizza"라는 닉네임이 존재하지 않으므로 테스트가 성공한다!

테스트 결과가 성공하면 람다 함수를 배포하고 Cognito에 접속하여 사전가입 트리거에 지금 만들어준 람다 함수를 넣어주면 닉네임 중복체크가 가능하다!

profile
에러와 부딪히고 새로운 것을 배우며 성장해가는 과정을 기록합니다!

0개의 댓글