스프린트/im-sprint-auth-session

im-sprint-auth-session-server

테오구 2021. 11. 22. 16:12
728x90

    ✓ 인증서 파일이 존재해야 합니다

$ mkcert -install
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

 

    ✓ 환경 변수에 데이터베이스 비밀번호가 존재해야 합니다.

 

DATABASE_PASSWORD= 비밀번호

DATABASE_PASSWORD= 비밀번호

 

      ✓ 성공적으로 데이터베이스에 연결해야 합니다

npm install --save-dev sequelize-cli
npx sequelize-cli init
npx sequelize-cli db:migrate

      ✓ 데이터베이스에 `Users` 테이블이 존재해야 합니다

npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

        ✓ 로그인 요청시 잘못된 사용자 아이디 혹은 비밀번호를 전달할 경우, `not authorized` 메세지가 응답에 포함되어야 합니다.
        ✓ 로그인 요청시 정확한 사용자 아이디와 비밀번호를 전달할 경우, `ok` 메세지가 응답에 포함되어야 합니다
        ✓ 세션 아이디를 전달하기 위한 `connect.sid` 쿠키가 존재해야 합니다 (이 쿠키는 express-session 모듈이 만듭니다)

 

// 해당 모델의 인스턴스를 models/index.js에서 가져옵니다.
const { Users } = require('../../models')

module.exports = {
  post: async (req, res) => {
    // userInfo는 유저정보가 데이터베이스에 존재하고, 완벽히 일치하는 경우에만 데이터가 존재합니다.
    // 만약 userInfo가 NULL 혹은 빈 객체라면 전달받은 유저정보가 데이터베이스에 존재하는지 확인해 보세요
    const userInfo = await Users.findOne({
      where: { userId: req.body.userId, password: req.body.password },
    })

    // TODO: userInfo 결과 존재 여부에 따라 응답을 구현하세요.
    // 결과가 존재하는 경우 세션 객체에 userId가 저장되어야 합니다.
    if (!userInfo) {
      // 로그인 요청시 잘못된 사용자 아이디 혹은 비밀번호를 전달할 경우,
      // `not authorized` 메세지가 응답에 포함되어야 합니다.
      res.send({ message: 'not authorized' })
      // your code here
    } else {
      // your code here
      // HINT: req.session을 사용하세요.
      // 로그인 요청시 정확한 사용자 아이디와 비밀번호를 전달할 경우, `ok` 메세지가 응답에 포함되어야 합니다
      // 세션 아이디를 전달하기 위한 `connect.sid` 쿠키가 존재해야 합니다 (이 쿠키는 express-session 모듈이 만듭니다)
      req.session.userId = userInfo.userId
      res.status(200).send({ message: 'ok' })
    }
  },
}

 

          ✓ 쿠키 옵션중 Domain 옵션은 `localhost`로 설정되어야 합니다
          ✓ 쿠키 옵션중 Path 옵션은 `/`로 설정되어야 합니다
          ✓ 쿠키 옵션중 HttpOnly 옵션이 설정되어야 합니다
          ✓ 쿠키 옵션중 Secure 옵션이 설정되어야 합니다
          ✓ 쿠키 옵션중 SameSite 옵션은 `none`으로 설정되어야 합니다

 

app.use(
  session({
    // ✓ 쿠키 옵션중 Domain 옵션은 `localhost`로 설정되어야 합니다
    // ✓ 쿠키 옵션중 Path 옵션은 `/`로 설정되어야 합니다
    // ✓ 쿠키 옵션중 HttpOnly 옵션이 설정되어야 합니다
    // ✓ 쿠키 옵션중 Secure 옵션이 설정되어야 합니다
    // ✓ 쿠키 옵션중 SameSite 옵션은 `none`으로 설정되어야 합니다
    secret: '@codestates',
    resave: false,
    saveUninitialized: true,
    cookie: {
      domain: 'localhost',
      path: '/',
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'none',
      httpOnly: true,
      secure: true,
    },
  })
)

login.js

 

✓ 로그인 이후 로그아웃를 요청하는 경우, 상태코드 200을 리턴해야 합니다

 

// 해당 모델의 인스턴스를 models/index.js에서 가져옵니다.
const { Users } = require('../../models')

module.exports = {
  post: async (req, res) => {
    // userInfo는 유저정보가 데이터베이스에 존재하고, 완벽히 일치하는 경우에만 데이터가 존재합니다.
    // 만약 userInfo가 NULL 혹은 빈 객체라면 전달받은 유저정보가 데이터베이스에 존재하는지 확인해 보세요
    const userInfo = await Users.findOne({
      where: { userId: req.body.userId, password: req.body.password },
    })

    // TODO: userInfo 결과 존재 여부에 따라 응답을 구현하세요.
    // 결과가 존재하는 경우 세션 객체에 userId가 저장되어야 합니다.
    if (!userInfo) {
      // 로그인 요청시 잘못된 사용자 아이디 혹은 비밀번호를 전달할 경우,
      // `not authorized` 메세지가 응답에 포함되어야 합니다.
      res.send({ message: 'not authorized' })
      // your code here
    } else {
      // your code here
      // HINT: req.session을 사용하세요.
      // 로그인 요청시 정확한 사용자 아이디와 비밀번호를 전달할 경우, `ok` 메세지가 응답에 포함되어야 합니다
      // 세션 아이디를 전달하기 위한 `connect.sid` 쿠키가 존재해야 합니다 (이 쿠키는 express-session 모듈이 만듭니다)
      req.session.userId = userInfo.userId
      res.status(200).send({ message: 'ok' })
    }
  },
}

 

Reference

 

	const { Users } = require('../../models');

module.exports = {
  post: async (req, res) => {
    const userInfo = await Users.findOne({
      where: { userId: req.body.userId, password: req.body.password },
    });

    // TODO: userInfo 결과 존재 여부에 따라 응답을 구현하세요.
    // 결과가 존재하는 경우 세션 객체에 userId가 저장되어야 합니다.
    if (!userInfo) {
      // your code here
      res.status(400).send({ data: null, message: 'not authorized' });
    } else {
      // your code here
      // HINT: req.session을 사용하세요.
      req.session.save(function () {
        req.session.userId = userInfo.userId;
        res.json({ data: userInfo, message: 'ok' });
      });
    }
  }
}

 

logout.js

어째서인지 res.session.destroy()를 사용하지 않아도 테스트 케이스는 통과가 된다.

module.exports = {
  post: (req, res) => {
    // TODO: 세션 아이디를 통해 고유한 세션 객체에 접근할 수 있습니다.
    // 앞서 로그인시 세션 객체에 저장했던 값이 존재할 경우, 이미 로그인한 상태로 판단할 수 있습니다.
    // 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.

    if (!req.session.userId) {
      // your code here
      res.status(400).send({ message: 'not authorized' })
    } else {
      res.status(200).send({ message: 'ok' })
      // your code here
      // TODO: 로그아웃 요청은 세션을 삭제하는 과정을 포함해야 합니다.
    }
  },
}

Reference

module.exports = {
  post: (req, res) => {

    // TODO: 세션 아이디를 통해 고유한 세션 객체에 접근할 수 있습니다.
    // 앞서 로그인시 세션 객체에 저장했던 값이 존재할 경우, 이미 로그인한 상태로 판단할 수 있습니다.
    // 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.

    if (!req.session.userId) {
      res.status(400).send({ data: null, message: 'not authorized' });
    } else {
      req.session.destroy();
      res.json({ data: null, message: 'ok' });
    }
  },
};

 

 

userinfo.js

 

const { Users } = require('../../models')

module.exports = {
  get: async (req, res) => {
    // TODO: 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.
    // HINT: 세션 객체에 담긴 정보가 궁금하다면 req.session을 콘솔로 출력해보세요

    if (!req.session.userId) {
      // your code here
      res.status(400).send({ message: 'not authorized' })
    } else {
      // your code here
      // TODO: 데이터베이스에서 로그인한 사용자의 정보를 조회한 후 응답합니다.
      res.status(200).send({ message: 'ok' })
    }
  },
}

Reference

const { Users } = require('../../models');

module.exports = {
  get: async (req, res) => {

    // TODO: 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.
    // HINT: 세션 객체에 담긴 정보가 궁금하다면 req.session을 콘솔로 출력해보세요

    if (!req.session.userId) {
      res.status(400).send({ data: null, message: 'not authorized' });
    } else {
      const result = await Users.findOne({
        where: { userId: req.session.userId },
      }).catch((err) => res.json(err));

      res.status(200).json({ data: result, message: 'ok' });
    }
  },
};
728x90

'스프린트 > im-sprint-auth-session' 카테고리의 다른 글

im-sprint-auth-session-client  (0) 2021.11.22