박민정

[feat] authentication

...@@ -18,6 +18,8 @@ app.use(cookieParser()) ...@@ -18,6 +18,8 @@ app.use(cookieParser())
18 18
19 const mongoose = require('mongoose') 19 const mongoose = require('mongoose')
20 20
21 +const { auth } = require('./middleware/auth')
22 +
21 //이 정보는 비밀임..! 몽고DB아이디랑 비밀번호를 감춰야해..! 23 //이 정보는 비밀임..! 몽고DB아이디랑 비밀번호를 감춰야해..!
22 mongoose.connect(config.mongoURI, { 24 mongoose.connect(config.mongoURI, {
23 useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false 25 useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false
...@@ -30,7 +32,7 @@ app.get('/', (req, res) => { ...@@ -30,7 +32,7 @@ app.get('/', (req, res) => {
30 32
31 // 회원가입 구현 33 // 회원가입 구현
32 // route의 endpoint는 register 34 // route의 endpoint는 register
33 -app.post('/register', (req, res) => { 35 +app.post('/api/users/register', (req, res) => {
34 // 회원가입할 때 필요한 정보들을 client에서 가져오면 36 // 회원가입할 때 필요한 정보들을 client에서 가져오면
35 // 그것들을 데이터베이스에 넣어준다. 37 // 그것들을 데이터베이스에 넣어준다.
36 38
...@@ -52,7 +54,7 @@ app.post('/register', (req, res) => { ...@@ -52,7 +54,7 @@ app.post('/register', (req, res) => {
52 }) 54 })
53 55
54 // 로그인 구현 56 // 로그인 구현
55 -app.post('/login', (req, res) => { 57 +app.post('/api/users/login', (req, res) => {
56 // 1. 요청된 이메일이 데이터베이스에 있는지 찾기 58 // 1. 요청된 이메일이 데이터베이스에 있는지 찾기
57 User.findOne({ email: req.body.email }, (err, user) => { 59 User.findOne({ email: req.body.email }, (err, user) => {
58 if(!user) 60 if(!user)
...@@ -79,6 +81,21 @@ app.post('/login', (req, res) => { ...@@ -79,6 +81,21 @@ app.post('/login', (req, res) => {
79 }) 81 })
80 }) 82 })
81 83
84 +
85 +//
86 +app.get('/api/users/auth', auth ,(req,res) => {
87 + // 여기까지 미들웨어(auth) 통과했으면 authentication == true 라는 뜻
88 + res.status(200).json({
89 + _id: req.user._id,
90 + isAdmin: req.user.role === 0 ? false : true, // role이 0이면 일반 유저, role이 0이 아니면 관리자.
91 + isAuth: true,
92 + email: req.user.email,
93 + lastname: req.user.lastname,
94 + role: req.user.role,
95 + image: req.user.image
96 + })
97 +})
98 +
82 app.listen(port, () => { 99 app.listen(port, () => {
83 console.log(`Example app listening at http://localhost:${port}`) 100 console.log(`Example app listening at http://localhost:${port}`)
84 }) 101 })
......
1 +const { User } = require("../models/User");
2 +
3 +let auth = (req, res, next) => {
4 + // 인증 처리
5 + // 1. client 쿠키에서 토큰을 가져옴.
6 + let token = req.cookies.loginCookie;
7 +
8 + // 2. 토큰을 복호화한 후 유저를 찾는다. (User.js에 findByToken(); 있음)
9 + User.findByToken(token, (err, user)=>{
10 + // 에러가 있으면
11 + if(err) throw err;
12 + // 유저가 없으면
13 + if(!user) return res.json({ isAuth:false, error: true})
14 + // 에러도 없고 유저도 있으면
15 + req.token = token; // token과 user를 request에 넣어줌으로써 index.js에서 request 사용할 수 있음
16 + req.user = user;
17 + next();
18 + });
19 +
20 + // 3. 유저가 있으면 인증OK, 유저가 없으면 인증No!
21 +}
22 +
23 +// 이 auth를 다른 파일에서도 쓸 수 있도록
24 +module.exports = { auth };
...\ No newline at end of file ...\ No newline at end of file
...@@ -90,6 +90,22 @@ userSchema.methods.generateToken = function(cb) ...@@ -90,6 +90,22 @@ userSchema.methods.generateToken = function(cb)
90 90
91 } 91 }
92 92
93 +userSchema.statics.findByToken = function(token, cb)
94 +{
95 + var user = this;
96 +
97 + // 1. 토큰을 decoding
98 + jwt.verify(token, 'secretToken', function(err, decoded) {
99 + // 2. 유저 아이디를 이용해서 유저를 찾은 다음에 클라이언트에서 가져온 토큰과 DB에 보관된 토큰이 일치하는지 확인.
100 + user.findOne({"_id": decoded, "token": token}, function(err, user){ // findOne :: mongoDB에 이미 있는 method
101 + // 에러가 나면
102 + if(err) return cb(err);
103 + // 에러가 안나면
104 + cb(null, user)
105 + })
106 + })
107 +}
108 +
93 // 만든 스키마를 모델로 감싸줌 109 // 만든 스키마를 모델로 감싸줌
94 const User = mongoose.model('User', userSchema) 110 const User = mongoose.model('User', userSchema)
95 111
......