token 을 이용한 user 인증(1)

yonghee·2022년 6월 13일
0

baechu-market

목록 보기
20/32

token user 인증 로직 순서

1) user가 phone 번호를 전송하면
2) 백엔드에서 DB에 있는 user의 phone 번호를 검색하게 된다.
3) 전송 받은 phone 번호로 유저가 존재 하지 않는다면 회원가입을 진행하고
4) 전송 받은 phone 번호로 유저가 존재한다면 DB에서 정보를 가져오게 된다.
5) 그 다음 user를 위한 token을 발급 시킨다. 이 token 값은 user와 연결 될 것이다.
6) 백엔드에서 token DB가 전송 되면 입력을 하게 된다.
token값을 받는 방식은 핸드폰 번호로 전송 받는 방식과 email로 전송 받는 방식으로 사용할 계획이다.

nodemailer를 이용한 email 인증 방식

번호 인증도 사용하였지만 nodemailer로 로직을 설명하려고 합니다.
nodemailer 사용은 프로젝트 블로깅 외적으로 따로 기술할 생각이다.

처음 만든 로직이 나에게 가장 적합하고 이해하기 수월한 로직 방식이다.

const { phone, email } = req.body;
let user;
if (email) {
    user = await client.user.findUnique({
      where: {
        //findUnique에서 where를 쓰면 email을 가진 user를 찾아 낼수 있다.
        email:email
      },
    });
    if (user) console.log("found it.");
    if (!user) {
      //user를 못찾았다면 user를 만들것이다.
      console.log("Did not find. Will create.");
      user = await client.user.create({        
        data: {
          name: "Anonymous",
          email,
          //이곳에는 user를 특정짓는 데이터를 같이 보내줘야 한다. name은 필수 값이며, email을 받았기 때문에 email도 추가해줬다.
        },
      });
    }
    console.log(user);
  }
  if (phone) {
    user = await client.user.findUnique({
      where: {
        phone: +phone,
      },
    });
    if (user) console.log("found it.");
    if (!user) {
      console.log("Did not find. Will create.");
      user = await client.user.create({
        data: {
          name: "Anonymous",
          phone: +phone,
        },
      });
    }
    console.log(user);
  } 

connect + create = connectOrCreate

connect는 새로운 토큰을 이미 존재하는 user와 연결해준다. create는 새로운 token을 만들어서 새로운 user도 만들게 된다. connectOrCreate는 이것을 동시에 가능하게 해준다.

//api/users/Login.ts
import twilio from "twilio";
import { NextApiRequest, NextApiResponse } from 'next';
import client from '../../../libs/server/client';
import Handler, { ResponseType } from "../../../libs/server/Handler"
const nodemailer = require("nodemailer");

const transporter = nodemailer.createTransport({
  service: "Naver",
  host: 'smtp.naver.com',
  port: 587,

  auth: {
    user: process.env.NAVER_ID,
    pass: process.env.NAVER_PWD,
    },
  });

const twilioClient = twilio(process.env.TWILIO_SID, process.env.TWILIO_TOKEN);

interface Data {
  email:string;
  phone:string;
}

async function handler(
  req: NextApiRequest, 
  res: NextApiResponse<ResponseType>
  ) {  
  const { phone, email  }:Data = req.body;  
  const user = phone ? { phone: phone } : email ? { email } : null;
    console.log(user)
  if(!user) return res.status(400).json({ok: false});
  const payload = Math.floor(100000 + Math.random() * 900000) + "";
  const token = await client.token.create({
    data: {
      payload,
      user: {
        connectOrCreate: {         
          where: {
            ...user,
          },
          create: {
            name: "Anonymous",
            ...user,
          },
        },
      },
    },    
  });

  if (phone) {
    const message = await twilioClient.messages.create({
      messagingServiceSid: process.env.TWILIO_MSID,
      to: process.env.MY_PHONE!,
      body: `Your login token is ${payload}.`,
    });
    console.log(message);
  } else if (email) {
      const sendEmail = await transporter.sendMail({
        from: `hello <yonghk423@naver.com>`,
        to: email,
        subject: 'token',
        text: `your login token is ${payload}`,
        html: `
          <div style="text-align: center;">
            <h3 style="color: #FA5882">hello</h3>
            <br />
            <p>your login token is ${payload}</p>
          </div>
      `})
      .then((result: any) => console.log(result))
      .catch((err: any) => console.log(err))
    }  

  return res.json({
    ok: true,
  	})  
  }

export default withHandler("POST", handler);
profile
필요할 때 남기는 날것의 기록 공간

0개의 댓글