일종의 권한을 말한다.
은행을 예로들자면 은행에 로그인을 하면 은행서버에서 이용자에게 토큰을 준다.
토큰을 가지고 있으면 은행 예금에서 입금과 출금을 할 수 있는 것이다.
즉, 토큰은 권한이다.
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에 있다.
이렇게 만들어진 모델은 Planetscale로 push해준다.
다음 명령어를 통해 push할 수 있다.
npx prisam db push
planetscale에 들어가서 확인해보면 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();
}
결과
위와같이 userId가 16인 user와 token이 잘 연결되었다.
prima studio open 명령어
npx prisma studio
위와같이 token이 생성되었음을 알 수 있다.
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는 유일한 값이여야 하지만 임으로 정해준 문자는 중복을 일으켜 오류를 발생한다. 이를 위해 임의의 숫자를 무작위로 정해주는 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는 임의의 숫자를 지정하기위한 변수로 설정한다.