Token Logic

minho·2022년 7월 14일
0

Token이란

일종의 권한을 말한다.
은행을 예로들자면 은행에 로그인을 하면 은행서버에서 이용자에게 토큰을 준다.
토큰을 가지고 있으면 은행 예금에서 입금과 출금을 할 수 있는 것이다.
즉, 토큰은 권한이다.

Prisma를 이용해 Token만들기

model User {
  id      Int      @id @default(autoincrement()) //autoincrement => id의 숫자를 자동으로 증가시켜준다.
  phone   Int?     @unique // unique => database에 유일한속성
  email   String?  @unique
  name    String // ?를 붙이지 않으면 자동으로 required된다.
  created DateTime @default(now())
  updated DateTime @updatedAt
  tokens  Token[]
}

model Token {
  id      Int      @id @default(autoincrement())
  payload String   @unique // user의 email이나 phone정보가 들어감
  user    User     @relation(fields: [userId], references: [id])
  userId  Int
  created DateTime @default(now())
  updated DateTime @updatedAt

}

token의 작동원리는 user와 userId에 있다.

  • Token에서 user는 model User를 참조한다.(참조만 할뿐 데이터베이스에는 저장하지 않는다.)
  • Token에서 userId를 통해 user를 구분한다.
    -> Prisama에게 userId를 통해 어느User와 Token이 연결되어있는지 알려줄 수 있다. (이때 userId는 User의 id를 의미한다.)

이렇게 만들어진 모델은 Planetscale로 push해준다.

planetsclae로 model보내기

다음 명령어를 통해 push할 수 있다.

npx prisam db push

planetscale에 들어가서 확인해보면 Token이 정상적으로 추가되었음을 확인할 수 있다.

token연결하기

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { phone, email } = req.body;
  const payload = phone ? { phone: +phone } : { email };
  const user = await client.user.upsert({
    where: {
      ...payload,
    },
    create: {
      name: "Anonymous",
      ...payload,
    },
    update: {},
  });
  const token = await client.token.create({
    data: {
      payload: "",
      user: {
        connect: {
          id: user.id,
        },
      },
    },
  });
  console.log(token);
  return res.status(200).end();
}
  • token을 create한다.
    - 이때 data에는 payload와 user가 필수로 들어가야 한다. payload에는 user의 email이나 phone가 들어가므로 잠시 비워둔다.
  • user와 연결하기 위해서 connect를 사용한다.
    - user의 id를 이용해서 연결하므로 connect에 id를 입력해준다.

결과

위와같이 userId가 16인 user와 token이 잘 연결되었다.

Token Prisma studio로 확인하기

prima studio open 명령어

npx prisma studio


위와같이 token이 생성되었음을 알 수 있다.

connectOrCreate

user가 데이터베이스에 있을때는 token과 connect시키고 없을때는 user를 새롭게 만들어 token과 연결시킬 수 있다.

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { phone, email } = req.body;
  const payload = phone ? { phone: +phone } : { email };
  const token = await client.token.create({
    data: {
      payload: "1",
      user: {
        connectOrCreate: {
          where: {
            ...payload,
          },
          create: {
            name: "Anonymous",
            ...payload,
          },
        },
      },
    },
  });
  console.log(token);
  return res.status(200).end();
}
  • payload는 유일한 값이여야 하므로 임의로 지정한다.
  • user가 있으면 where을 실행하고 connect를 하며, user가 없으면 create를 실행하고 connect를 실행한다.

payload 설정

payload는 유일한 값이여야 하지만 임으로 정해준 문자는 중복을 일으켜 오류를 발생한다. 이를 위해 임의의 숫자를 무작위로 정해주는 payload를 설정한다.

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { phone, email } = req.body;
  const user = phone ? { phone: +phone } : { email };
  const payload = Math.floor(10000 + Math.random() * 90000) + "";
  const token = await client.token.create({
    data: {
      payload,
      user: {
        connectOrCreate: {
          where: {
            ...user,
          },
          create: {
            name: "Anonymous",
            ...user,
          },
        },
      },
    },
  });
  console.log(token);
  return res.status(200).end();
}

기존의 payload의 이름은 user로 변경하고, payload는 임의의 숫자를 지정하기위한 변수로 설정한다.

profile
Live the way you think

0개의 댓글