-
auth 기능 구현Study/Node, React 기초 강의_John Ahn 2023. 2. 19. 13:05
루트 디렉터리에 middleware 폴더 생성
middleware 폴더에 auth.js 구현
// User 모델을 불러옴 const { User } = require('../models/User'); let auth = (req, res, next) => { // 인증 처리를 하는 곳 // 클라이언트 쿠키에서 토큰을 가져온다. let token = req.cookies.x_auth; // 토큰을 복호화한 후 유저를 찾는다. User.findByToken(token, (err, user) => { if (err) throw err; if (!user) return res.json({ isAuth: false, error: true }) req.token = token; req.user = user; next(); }) // 유저가 있으면 인증 Okey // 유저가 없으면 인증 No! }
User.js에 userSchema.statics.findByToken 구현
userSchema.statics.findByToken = function(token, cb){ var user = this; // 토큰을 decode한다. jwt.verify(token, 'secretToken', function (err, decoded) { // 유저 아이디를 이용해서 유저를 찾은 다음에 클라이언트에서 가져온 token과 DB에 보관된 토큰이 일치하는지 확인 user.findOne({ "_id": decoded, "token": token }, function (err, user) { if (err) return cb(err); cb(null, user) }) }) }
index.js에 권한에 대한 처리 구현
// express 모듈을 추가 const express = require('express') // 새로운 express 모듈을 생성 const app = express() // port 설정 const port = 5000 // User 모델을 가져옴 const { User } = require("./models/User"); // bodyPaser를 가져옴 const bodyPaser = require("body-parser"); // config를 가져옴 const config = require('./config/key'); // cookieParser를 가져옴 const cookieParser = require("cookie-parser"); // auth를 가져옴 const { User } = require('./middleware/User'); // bodyPaser 옵션주기 // application/s-www-form-urlencoded app.use(bodyPaser.urlencoded({ extended: true })); // application/json app.use(bodyPaser.json()); app.use(cookieParser()); // mongoose 연결 const mongoose = require('mongoose') // error 발생을 막기 위한 코드 mongoose.connect("mongodb+srv://<아이디>:<비밀번호>@boilerplate.6t2ootw.mongodb.net/?retryWrites=true&w=majority" ).then(() => console.log('MongoDB Connected...')) // DB 연결 확인을 위한 코드 .catch(err => console.log(err)) // Hello World! 전송 app.get('/', (req, res) => { res.send('Hello World!!') }) app.post('/api/user/register', (req, res) => { // 회원 가입 할때 필요한 정보들을 client에서 가져오면 그것들을 데이터 베이스에 넣어준다. const user = new User(req.body) user.save((err, userInfo) => { if (err) return res.json({ success: false, err }) return res.status(200).json({ success: true }) }) }) app.post('/api/user/login', (req, res) => { User.findOne({ email: req.body.email }, (err, user) => { // 요청된 이메일을 데이터베이스에서 있는지 찾는다. User.findOne({ email: req.body.email }, (err, user) => { if (!user) { return res.json({ loginSuccess: false, message: "제공된 이메일에 해당하는 유저가 없습니다." }) } }) // 요청된 이메일이 데이터 베이스에 있다면 비밀번호가 맞는 비밀번호 인지 확인. user.comparePassword(req.body.password, (err, isMatch) => { if (!isMatch) return req.json({ loginSuccess: false, message: "비밀번호가 틀렸습니다." }) // 비밀번호 까지 맞다면 토큰을 생성하기. user.generateToken((err, user) => { if (err) return res.status(400).send(err); // 토큰을 저장한다. 어디에? 쿠키 or 로컬스토리지 res.cookie("x_auth", user.token) .status(200) .json({ loginSuccess: true, userId: user._id }) }) }) }) }) app.get('/api/user/auth', auth, (req, res) => { // 여기까지 미들웨어를 통과해 왔다는 얘기는 Authentication이 True라는 말. res.status(200).json({ _id: req.user._id, isAdmin: req.user.role === 0 ? false : true, isAuth: true, email: req.user.email, name: req.user.role, lastname: req.user.lastname, role: req.user.role, image: req.user.image }) }) // 5000번 port에서 실행 app.listen(port, () => { console.log(`Example app listening on port ${port}`) })
'Study > Node, React 기초 강의_John Ahn' 카테고리의 다른 글
토큰 생성 (0) 2023.02.19 로그인 기능 구현 (0) 2023.02.19 Bcrypt를 이용한 비밀번호 암호화 (0) 2023.02.19 비밀 설정 정보 관리 (0) 2023.02.19 Nodemon (0) 2023.02.14