-
Notifications
You must be signed in to change notification settings - Fork 1
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
base: main
Are you sure you want to change the base?
Conversation
@@ -1,5 +1,6 @@ | |||
import express from "express"; | |||
import apiRoutes from "./api"; | |||
import userRouters from "../module/user/user.routes"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
불필요한 import
문장이므로 삭제 부탁드립니다!
// import './module/todo/todo.routes'; | ||
|
||
// import validator from "validator"; | ||
|
||
|
There was a problem hiding this comment.
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"; |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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
// 모든 회원 정보 보여주기 | ||
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() }); | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
user
, 주최자들의 정보를 한꺼번에 API로 요청하는 일은 없습니다. 따라서 지우는 게 좋을 것 같아요!
module/user/user.controller.js
Outdated
// 로그인 | ||
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() }); | ||
} | ||
}; |
There was a problem hiding this comment.
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)
// 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); | ||
} | ||
}); | ||
*/ |
There was a problem hiding this comment.
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)); // 모든 유저 정보 불러오기 |
There was a problem hiding this comment.
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", |
There was a problem hiding this comment.
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로 설치해서 사용하기 때문에 충돌을 방지하기 위해서 꼭 지워주시기 바랍니다!
There was a problem hiding this 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를 지우고 다시 파서, 제가 참조한 링크들을 보시면서 차근차근 다시 도전해볼 수 있습니다. 언제나 도움이 필요하다면 슬랙 채널에 꼭 글 남겨주세요!
리뷰 감사합니다ㅜㅜ |
// get은 DB에서 클라이언트 정보 가져오기 | ||
// post는 클라이언트가 DB로 정보 보내기 | ||
userRoutes.post('/signup', asyncWrapper(userController.userCreate)); // email, password로 가입 | ||
userRoutes.get('/signin', asyncWrapper(userController.userFind)); // 모든 유저 정보 불러오기 |
There was a problem hiding this comment.
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 같은걸 주면 될거 같네요
POST로 userModel에 email, password 저장할 수 있는 /signup api 구현했습니다! 확인 부탁드립니다 ㅎㅎ