2022-04-10 T.I.L

정종훈·2022년 5월 18일
0

first project

목록 보기
6/10

2022/04/10

토큰 만들자!!

  • 컨트롤러/tokenFuntions/index.js 구현

토큰을 발급하는 함수.

토큰을 클라이언트 쿠키로 저장하게 해주는 함수

토큰이 유효한지 확인하는함수 세개를 만듦

토큰 공부!!!!!!!!!!!!!!!!!!!

자 그러면 토큰관련 함수는 정의했으니 유저 인증을 담당하는 로직을 작성해보자.

  • 컨트롤러/인증/유저인증.js

401 vs 403 관련 https://blog.yevgnenll.me/posts/401-vs-403

  1. 우선 클라이언트 쿠키에서 토큰이 왔는지 검사.
  2. 토큰이 유효한지를 검사. 여기서 토큰을 복호화함.
  3. 토큰 정보가 유효한지를 검사. 여기서 db에 들어가야함.
  4. 1~3이 다 맞다면 유저정보 리턴.

자 그럼 문제는 db를 구현 했나? & 일단 로그아웃부터 가볼까?

컨트롤러/유저/사인아웃 ㄱㄱ싱

그전에 중요 : 사인아웃 할때 REST API는 201 이 아니라 200임!

안녕하십니까 주말에 고생많으십니다.

다름이 아니라 로그아웃 구현을 하고 있는데

저희가 API에 의하면 로그아웃 성공시 상태코드 201을 반환한다고 되어있습니다.

허나 제가 자료를 찾아보며 든 생각에는 200을 반환해야 할것같습니다.

mdn 상태코드 레퍼런스 : https://developer.mozilla.org/ko/docs/Web/HTTP/Status

를 보시면 201은 서버측에서 새로운 리소스가 생성되어야 합니다.

허나 저의 토큰으로 주고 받은 구현에서는

단지 클라이언트에서 서버측으로 req.cookie로 액세스 토큰 쏴주면 서버에서는 똑같이 쿠키로 토큰을 보내는데

유효기간(expires: 0초)을 없애면서 토큰을 못쓰게 하는 방식으로 구현했습니다.

(구현방법은 저희 하쿠나마타타 로그아웃 부분 참고하였습니다
https://github.com/codestates/HAKUNA-MATATA/blob/master/server/controllers/users/logout.js)

따라서 서버측에서 새로운 리소스가 생기거나 바뀌는것은 없다고 생각하기 떄문에 로그아웃 성공 상태는 201이 아니라 200이 되어야 할 것 같습니다.

또한 다른 api문서인

카카오 로그아웃 api : https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#logout

IBM 로그아웃 api : https://www.ibm.com/docs/en/sgklm/4.0?topic=services-logout-rest-service

에 본다면 로그아웃 성공시 상태코드는 200이라 명시되어있습니다. 2022년 4월 10일 오후 12:00

res.cookie로 실려온 토큰을 해석해서 있으면

그 토큰을 무효화(expire 0으로 만듬)하면서 토큰 다시 보내주고 끝.

근데 이게 되는지 실험하려면 토큰이 있어야 하니 signin, singup 해야됨. 일단 해보자

  • 컨트롤러/user/signup 구현

시퀄라이즈쓸떄 https://sequelize.org/docs/v6/core-concepts/model-querying-basics/

Op. 객체를 지정해 줌으로써 연산을 명시 해줄거임 나중에

또한 비밀번호를 암호화하기 위해 bcrypt 쓸거임

개념참고: https://velog.io/@kho5420/bcrypt-jwt-양방향-암호화-단방향-암호화

npm 문서 : https://www.npmjs.com/package/bcrypt

암호화 하는법

const saltRounds = 10;
const myPlaintextPassword = 's0/\/\P4$$w0rD';
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
    // Store hash in your password DB.
});

saltRounds는 셀트로 숲자가 높을수록 함호화 증가.

myPlain어쩌구는 내 암호화할 암호.

인자3 인 콜백함수는 옵션.

맞는지 확인하는법

// Load hash from your password DB.
bcrypt.compare(myPlaintextPassword, hash, function(err, result) {
    // result == true
});
bcrypt.compare(someOtherPlaintextPassword, hash, function(err, result) {
    // result == false
});
  • 문제) 잠깐.. 회원가입 구현하려는데

이미 로그인 되어있으면(토큰이 존재하면) 여부를 확인해햐하는데

토큰이 없는경우에는 토큰을 아예 읽을수가 없어 undefined 에러 뜸..

⇒ 해결 app.js에 쿠키 파서 설치해야 req.cookies 사용가능!

  • 문제) 또 하려는데

findOne 못 읽겠다고 또 뭐라함..

⇒ 해결 model 폴더 가보니까 user가 아니라User임 그래서 user.findOne이 아니라 User.findOne으로 바꿔줌.

signup 구현 완료

const bcrypt = require('bcrypt');
const { User } = require('../../models');
const {
    checkAccessToken,
} = require('../tokenFunctions');

module.exports = async (req, res) => {
  
  try {
    // 이미 로그인 되어있는 경우 => 토큰이 있는경우
    let accessToken;
    if (req.cookies) {
      accessToken = req.cookies.accessToken;
    } else {
      accessToken = null;
    }

    const accessTokenData = checkAccessToken(accessToken);
    if (accessTokenData) {
      return res.status(400).json({
        data: null,
        message: 'Already logged in!',
      })
    }
    // 요청이 잘못된 경우 (이메일, 비밀번호가 없을경우)는 클라이언트에서 해결
    const { email, password } = req.body;

    // 요청받은 정보로 이미 회원이 있는경우
    const userInfo = await User.findOne({
      where: { email },
    });
    if (userInfo) {
      return res.status(409).json({
        data: null,
        message : "email already exist"
      })
    } 
  
    // 다 통과하면 비밀번호 함호화하고 새로운 회원 생성 bcrypt 쓸때 await 써주어야함.
    const hashPassword = await bcrypt.hash(password, 10);
    const newUser = await User.create({
      email,
      password: hashPassword,
      point: 0,
    })
    // console.log(newUser)
    // 비밀번호 지우고 생성한것을 돌려줌
    delete newUser.dataValues.password;
    return res.status(200).json({
      data: newUser.dataValues,
      message: "signup success",
    })

  } catch (e) {
    console.error(e);
    res.status(500).json({ message: 'Server error!' });
  }
}

자 그럼 mypage 수정 드가자!! 컨트롤러/user/mypage

  • 문제) mypage에서

6번쨰줄 userAuthon을 이용하려면 컨트롤러/authnization/userAction으로 가야함

여기서 accessToken 을 검사하려면 클라이언트에서 req.cookies로 토큰을 보내야하는데

postman으로 어떻게 cookie를 날려 실험하는지 모르겠음.

⇒ 쿠키 파서 설치 !!
  • 문제) 컨트롤러/user/mapage.js 에서 회원정보수정하려는 로직구성중

회원가입 수정하려는데

오류)

AssertionError [ERR_ASSERTION]: Missing where attribute in the options parameter

오류 뜸.

그래서 시퀄라이저 update 문법이 이상한것같아 찾아봐야됨.

  • 문제) 클라이언트와 서버연결하는 데

POST https://localhost:4000/user/signup net::ERR_SSL_PROTOCOL_ERROR

오류

⇒ 해결. 클라이언트측에서 https로 보내는데 우리는 http로 서버구현해서 http로 바꿔줌

profile
괴발개발자에서 개발자로 향해보자

0개의 댓글