ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] Passport.js - 로그인 인증 및 세션 (Typescript)
    JavaScript/NodeJS 2020. 8. 22. 16:13
    728x90
    • Node.js에서 사용하는 인증관련 미들웨어
    • 로그인, 접근 권한 등을 인터셉트해서 권한을 체크
    • Express, Express-session 미들웨어와 연동 가능하여 유연한 기능 제공
    • 인증을 위한 다양한 Strategy 제공(e.g. Facebook. Google ...)

    passport.js 적용

    1. 모듈 설치

    $ npm i passport passport-local -D

    2. passport 미들웨어 설정

    // app.js
    import express from 'express';
    import bodyParser from 'body-parser';
    import session from 'express-session';
    import passport from 'passport';
    import Passport from './config/passport';
    import path from 'path';
    
    class App {
        public app: express.Applicaition = new express();
        public passportConfig: Passport = new Passport();
    
        constructor(controllers, public port: number) {
            this.initMiddlewares();
            this.initRouters(controllers);
        }
    
        private initRouters(controllers: any) {
            controllers.map((controller) => {
                this.app.use(controller.url, controller.object.router);
            })
        }
    
        private initMiddlewares() {
            this.app.use(bodyParser.json());
            this.app.use(bodyParser.urlencoded({ extended : false }));
            this.app.use(session({
                secret:`@#@$MYSIGN#@$#$`,
                resave: false,
                saveUninitialized: true 
            }))
            this.app.use(passport.initialize());
            this.app.use(passport.session());
            this.passportConfig.config();
        }
    
        public listen(server) {
            server.listen(this.port, () => {
                console.log(`Server is running on ${this.port}`);
            })
        }
    }
    
    export default App;

    3. Strategy 정의

    // passport.ts
    import passport from 'passport';
    import passportLocal from 'passport-local';
    import User from '../Models/UserModel';
    
    const LocalStrategy = passportLocal.Strategy;
    
    class Passport {
        public config = () => {
            // Local Strategy
            passport.use(new LocalStrategy({
                usernameField: 'id',
                passwordField: 'pw'
            },
            (id, pw, done) => {
                return User.findOne({
                    where: {
                        id: id,
                        pw: pw
                    }
                })
                .then(user => {
                    if(!user) {
                        return done(null, false, { message: 'Incorrect ID or PW' })
                    }
        
                    return done(null, user, { message: 'Login Success' });
                })
                .catch(err => done(err));
            }))
    
            passport.serializeUser<any, any>((user, done) => {
                done(null, user);
            });
             
            passport.deserializeUser(function(user, done) {
                done(null, user);
            });
        }
        
        public isAuthenticated = (req, res, next) => {
            if (req.isAuthenticated()) {
                return next();
            }
            res.redirect("/");
        };
    }
    
    export default Passport;

    serializeUser

    • 로그인에 성공하면 serializeUser 메서드를 통해 사용자 정보를 Session에 저장

    deserializeUser

    • 요청을 받으면 호출되어 Session에 저장된 사용자 정보를 불러옴
    • req.user에 사용자 정보를 저장

    isAuthenticated

    • 로그인 여부를 확인하는 Function

    4. 인증 구현

    // UserController.ts
    import express from 'express';
    import passport from 'passport';
    import Passport from '../config/passport';
    
    class UserController {
        public router = express.Router();
        public passport: Pssport = new Pasport();
        constructor() {
            this.initRouters();
        }
    
        private initRouters() {
            this.router.post('/login', passport.authenticate('local', {
                successRedirect: '/rooms',
                failureRedirect: '/'
            }))
            this.router.get('/rooms', this.passport.isAuthenticated, this.renderRooms);
        }
    
        renderRoom = (req: express.Request, res: express.Response) => {
            console.log(req.user); // Session에 저장된 사용자 정보 출력
    
            res.render('rooms');
        }
    }
    
    export default UserController;
    728x90

    'JavaScript > NodeJS' 카테고리의 다른 글

    [Node.js] Jest  (0) 2020.10.18
    [NestJS] NestJS CORS Setting  (0) 2020.09.13
    [Node.js] pm2란?  (0) 2020.08.17
    [Node.js] Node projects with --lib es6: cannot find name 'console'  (0) 2020.08.16
    [Node.js] Middleware 란?  (0) 2020.08.16
Designed by Tistory.