리셋 되지 말자

[NodeJS] Passport 세션이용 본문

NodeJS/생활코딩

[NodeJS] Passport 세션이용

kyeongjun-dev 2020. 9. 28. 17:00

not in use

const express = require('express')
const app = express()
const port = 80
var compression = require('compression')
var bodyParser = require('body-parser');
var pageRouter = require('./routes/page');
var indexRouter = require('./routes/index');
var authorRouter = require('./routes/author');
var authRouter = require('./routes/auth');
var helmet = require('helmet')
var session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(helmet());
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(compression());

app.use(session({
    secret: 'sknfienf123',
    resave: false,
    saveUninitialized: true,
    store:new FileStore()
}))

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function (user, done) {
    console.log('serialize', user);
    done(null, user.email);
});

passport.deserializeUser(function (id, done) {
    console.log('deserialize', id);
    done(null, authData);
});

passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'pwd'
    },
    function (username, password, done) {
        const authData = {
            email:'rudwns273@naver.com',
            password:'12345',
            nickname:'rudwns'
        }
        console.log(username, password);
        if(username==authData.email){
            if(password==authData.password){
                console.log(1);
                done(null, authData);
            }else{
                return done(null, false, {
                    message: 'Incorrect password.'
                });    
            }
        }else{
            return done(null, false, {
                message: 'Incorrect username.'
            });
        }
    }
));

app.post('/auth/login_process',
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/auth/login' }
));

이전 게시물의 오류내용대로 passport.initialize()를 해준다.

위의 설명을 참고하여 코드에 반영한다.

const express = require('express')
const app = express()
const port = 80
var compression = require('compression')
var bodyParser = require('body-parser');
var pageRouter = require('./routes/page');
var indexRouter = require('./routes/index');
var authorRouter = require('./routes/author');
var authRouter = require('./routes/auth');
var helmet = require('helmet')
var session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(helmet());
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(compression());

app.use(session({
    secret: 'sknfienf123',
    resave: false,
    saveUninitialized: true,
    store:new FileStore()
}))

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'pwd'
    },
    function (username, password, done) {
        const authData = {
            email:'rudwns273@naver.com',
            password:'12345'
        }
        console.log(username, password);
        if(username==authData.email){
            if(password==authData.password){
                console.log(1);
                done(null, authData);
            }else{
                return done(null, false, {
                    message: 'Incorrect password.'
                });    
            }
        }else{
            return done(null, false, {
                message: 'Incorrect username.'
            });
        }
    }
));

app.post('/auth/login_process',
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/auth/login' }
));

passport.initialize()와 passport.session()을 use 한다. 

 

  • 실행 결과

serialize 오류가 뜬다 이걸로 다시 검색을 해본다.

 

passport가 session을 이용할 때의 사용법을 찾을 수 있다.

 

  • 코드 반영
const express = require('express')
const app = express()
const port = 80
var compression = require('compression')
var bodyParser = require('body-parser');
var pageRouter = require('./routes/page');
var indexRouter = require('./routes/index');
var authorRouter = require('./routes/author');
var authRouter = require('./routes/auth');
var helmet = require('helmet')
var session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(helmet());
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(compression());

app.use(session({
    secret: 'sknfienf123',
    resave: false,
    saveUninitialized: true,
    store:new FileStore()
}))

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function (user, done) {
    console.log('serialize', user);
    // done(null, user.id);
});

passport.deserializeUser(function (id, done) {
    console.log('deserialize', id);
    // User.findById(id, function (err, user) {
    //     done(err, user);
    // });
});

passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'pwd'
    },
    function (username, password, done) {
        const authData = {
            email:'rudwns273@naver.com',
            password:'12345'
        }
        console.log(username, password);
        if(username==authData.email){
            if(password==authData.password){
                console.log(1);
                done(null, authData);
            }else{
                return done(null, false, {
                    message: 'Incorrect password.'
                });    
            }
        }else{
            return done(null, false, {
                message: 'Incorrect username.'
            });
        }
    }
));

app.post('/auth/login_process',
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/auth/login' }
));

 

serializeUser는 로그인에 성공했을 때, 콜백함수가 실행되도록 되어있다.

로그인에 성공했을 때, 콘솔에 출력되는 것을 확인할 수 있다. 즉, 로그인 성공 시 authData를 전송했고, 전송한 정보를 첫 번째 인자로 받는 콜백 함수를 실행한다.

 

passport.serializeUser(function (user, done) {
    console.log('serialize', user);
    done(null, user.email);
    // done(null, user.id);
});

로그인에 성공하면 done 함수를 호출하는데, 첫번째 인자로는 null, 두 번째 인자론느 사용자를 식별할 수 있는 식별자를 준다. 여기서 식별자는 email이므로 user.email을 준다.

 

 

코드 실행

지금까지의 코드를 실행해보자.

const express = require('express')
const app = express()
const port = 80
var compression = require('compression')
var bodyParser = require('body-parser');
var pageRouter = require('./routes/page');
var indexRouter = require('./routes/index');
var authorRouter = require('./routes/author');
var authRouter = require('./routes/auth');
var helmet = require('helmet')
var session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(helmet());
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(compression());

app.use(session({
    secret: 'sknfienf123',
    resave: false,
    saveUninitialized: true,
    store:new FileStore()
}))

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function (user, done) {
    console.log('serialize', user);
    done(null, user.email);
});

passport.deserializeUser(function (id, done) {
    console.log('deserialize', id);
    done(null, authData);
});

passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'pwd'
    },
    function (username, password, done) {
        const authData = {
            email:'rudwns273@naver.com',
            password:'12345',
            nickname:'rudwns'
        }
        console.log(username, password);
        if(username==authData.email){
            if(password==authData.password){
                console.log(1);
                done(null, authData);
            }else{
                return done(null, false, {
                    message: 'Incorrect password.'
                });    
            }
        }else{
            return done(null, false, {
                message: 'Incorrect username.'
            });
        }
    }
));

app.post('/auth/login_process',
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/auth/login' }
));

deserializeUser함수도 주석을 제거해주었다.

  • index.js
router.get('/', (req, res) => {
    console.log('main', req.user);
    db.query('SELECT * FROM topic', function (error, topics) {
        //console.log('/', req.user);
        if (error) throw error;
        var description = 'Hello, Node.js';
        var title = 'Welcome';
        var list = template.list(topics);

        var html = template.html(title, list, `<h2>${title}</h2>
        ${description}
        `, `<a href="/page/create">create</a>`,
        auth.statusUI(req, res));
        res.send(html);

    });
});

로그인을 하면, request에 'user'라는 객체가 들어있어야 한다. 이것을 확인하기 위해 '/'로 접속 시, req.user를 출력해보도록 하였다.

  • 결과

접속했을 때, 로그인을 안한 상태이므로 req.user가 undefined 상태이다. 그리고 로그인을 했을 때, serializeUser가 실행이 되었는데, request에 user가 생성되지 않았다. 

sessions의 쿠키를 확인해 보아도, user.id로 건네준 email 값이 없다.

다음 글에서 이 문제를 해결하도록 하자.

'NodeJS > 생활코딩' 카테고리의 다른 글

[NodeJS] Passport 로그아웃  (0) 2020.10.05
[NodeJS] Passport 로그인 확인  (0) 2020.10.05
[NodeJS] Passport 인증 구현 및 자격 확인  (0) 2020.09.28
[NodeJS] Passport 설치  (0) 2020.09.28
[express] session 추가사항  (0) 2020.09.28
Comments