Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

이메일, 비밀번호 DB 저장 API 구현 #8

Open
wants to merge 10 commits into
base: main
Choose a base branch
from

Conversation

zeze1004
Copy link

@zeze1004 zeze1004 commented Feb 8, 2021

POST로 userModel에 email, password 저장할 수 있는 /signup api 구현했습니다! 확인 부탁드립니다 ㅎㅎ

@r4k0nb4k0n r4k0nb4k0n requested review from a team, r4k0nb4k0n, gusrb3164 and rxdcxdrnine and removed request for a team February 8, 2021 16:41
@r4k0nb4k0n r4k0nb4k0n added the enhancement New feature or request label Feb 8, 2021
@r4k0nb4k0n r4k0nb4k0n added this to the 필수 REST API milestone Feb 8, 2021
@r4k0nb4k0n r4k0nb4k0n linked an issue Feb 8, 2021 that may be closed by this pull request
4 tasks
@@ -1,5 +1,6 @@
import express from "express";
import apiRoutes from "./api";
import userRouters from "../module/user/user.routes";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불필요한 import 문장이므로 삭제 부탁드립니다!

Comment on lines +14 to +18
// import './module/todo/todo.routes';

// import validator from "validator";


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필요없는 주석이므로 삭제 부탁드립니다!

@@ -0,0 +1,93 @@
import { userModel } from "./user.model";
import { StatusCodes, ReasonPhrases } from "http-status-codes";
// import { body, validationResult } from "validator";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필요없는 주석이므로 삭제 부탁드립니다!

console.log(req.body);
const user = await userModel.create({
email: req.body.email,
password: req.body.password
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is vulnerable

중요정보 평문 저장 취약점
중요정보를 평문으로 저장하는 경우 의도치 않은 사용자에게 쉽게 노출이 될 수 있습니다.
이는 password hashing + salt로 최대한 방지할 수 있습니다.
Reference: https://www.sickyourcoding.com/forQuiz/storage

How to solve

express mongodb 활용하기 - 회원가입 구현하기(bcrypt로 암호화)

Comment on lines +24 to +34
// 모든 회원 정보 보여주기
userController.userFind = async (req, res) => {
try {
const users = await userModel.find();
return res.json(users);
} catch (error) {
return res
.status(StatusCodes.INTERNAL_SERVER_ERROR)
.json({ error: error.toString() });
}
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

user, 주최자들의 정보를 한꺼번에 API로 요청하는 일은 없습니다. 따라서 지우는 게 좋을 것 같아요!

Comment on lines 36 to 57
// 로그인
userController.login = async (req, res) => {
try {
const user = await userModel.findOne({
email: req.body.email,
password: req.body.password
});
// const user = await userModel.findById(req.params.id);
if (!user) {
return res
.status(StatusCodes.BAD_REQUEST)
// .json({ message: "user not found" });
.send('가입 되지 않은 회원입니다.');
// .redirect("/api-docs"); // 로그인 화면으로 다시 redirect
}
return res.json(user);
} catch (error) {
return res
.status(StatusCodes.INTERNAL_SERVER_ERROR)
.json({ error: error.toString() });
}
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body로 받은 password를 hash -> DB에 저장되어 있는, hashed password와 비교하는 로직이 필요합니다.

Reference: express mongodb 활용하기 - 로그인 기능 만들기 (jwt)

Comment on lines +11 to +28
// userRouters.post('/signup', asyncWrapper(userController.signup));
// userRouters.post('/signin', asyncWrapper(userController.signin));
// userRouters.post('/logout', asyncWrapper(userController.logout));


// GET /signup으로 좁속했을 때의 라우터
/*
router.get('/singup',async(req, res, next) => {
try {
// User.find({})로 모든 사용자 찾기
const users = await User.find({});
res.render('mongoose', 'users');
} catch (err) {
console.error(err);
next(err);
}
});
*/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필요없는 주석이므로 삭제 부탁드립니다!

// get은 DB에서 클라이언트 정보 가져오기
// post는 클라이언트가 DB로 정보 보내기
userRoutes.post('/signup', asyncWrapper(userController.userCreate)); // email, password로 가입
userRoutes.get('/signin', asyncWrapper(userController.userFind)); // 모든 유저 정보 불러오기
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로그인 시 모든 유저 정보를 불러올 일이 없을 것 같아요! 삭제하는 것이 어떨까요?

@@ -32,7 +44,7 @@
"eslint-config-prettier": "^7.2.0",
"eslint-plugin-prettier": "^3.3.1",
"nodemon": "^2.0.7",
"prettier": "^2.2.1",
"prettier": "2.2.1",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필요없는 package들은 yarn remove로 꼭 지워주시기 바랍니다!
특히 yarn은 package manager로, 프로젝트에 local로 설치해서 사용하는 것이 아니라 global로 설치해서 사용하기 때문에 충돌을 방지하기 위해서 꼭 지워주시기 바랍니다!

Copy link
Member

@r4k0nb4k0n r4k0nb4k0n left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자세한 내용은 코드마다 comment를 달아드렸지만, 할 일들을 크게 정리하자면 아래와 같습니다.

  • 필요없는 코드 및 주석 제거
  • package.json 필요없는 모듈 정리
  • password hashing
  • token

인증은 어느 프로젝트나 까다로운 것 같습니다. 특히 외부 서비스 계정을 연동하는 것은 production level에서 요구할 법한 것이라 생각해요. @zeze1004 님이 고군분투하셨다는 것은 코드 여기저기 남아있는 흔적들을 통해 알 수 있었습니다.

현재 branch에서 제가 제시한 사항들을 일일이 수정할 수도 있습니다. 아니면 현재 branch를 지우고 다시 파서, 제가 참조한 링크들을 보시면서 차근차근 다시 도전해볼 수 있습니다. 언제나 도움이 필요하다면 슬랙 채널에 꼭 글 남겨주세요!

@zeze1004
Copy link
Author

zeze1004 commented Feb 9, 2021

리뷰 감사합니다ㅜㅜ
주석 지울 생각을 못했네요...부끄럽습니다 하핳
올려주신 리뷰 참고하며 다시 pr 날리겠습니다!

// get은 DB에서 클라이언트 정보 가져오기
// post는 클라이언트가 DB로 정보 보내기
userRoutes.post('/signup', asyncWrapper(userController.userCreate)); // email, password로 가입
userRoutes.get('/signin', asyncWrapper(userController.userFind)); // 모든 유저 정보 불러오기

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get 을 통해서 이메일이 중복되는지 확인하는 로직을 수행해야 하면은
/signin 의 body에 email을 넣어서 보내던가 아니면
/signin/:email 이런식으로 route를 설정해놓은뒤 email parameter 값을 받아서
이메일이 이미 존재한다면 return 으로 Fail, 없다면 OK 같은걸 주면 될거 같네요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

계정 관련 API 구현
3 participants