Showing
3 changed files
with
59 additions
and
2 deletions
... | @@ -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 | }) | ... | ... |
boiler-plate/middleware/auth.js
0 → 100644
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 | ... | ... |
-
Please register or login to post a comment