카테고리 없음

passportjs, auth 인증 (로그인 하지 않을 경우 마이페이 접근 못하게)

Canyi 2022. 11. 23. 12:17

1. local 인증

2. 타사 인증(Federation Authentication)

 

MongoDBWebserver.js

npm install passport passport-local

 

 

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

 

 

//passport 미들웨어
app.use(passport.initialize());
app.use(passport.session());

 

 

 

//로그인 passport 인증
app.post('/login', passport.authenticate('local',{
            
            failureRedirect : '/fail'

        }), function (req , res) {
    
        res.redirect('/');
})

passport.use(new LocalStrategy({
    
    usernameField : 'id',
    passwordField : 'pw',
    session : true,
    passReqToCallback : false,
}, function(inputid, inputpw, done){
    console.log(inputid);
    console.log(inputpw);
    
    db.collection('login').findOne({id :inputid}, function (err,result,res){

        if(err) return done(err); //done : 
        if(!result){
            return done(null, false, {message : '존재하지 않는 아이디입니다.'});  //null: server error code
        }
        if(result.pw == inputpw){
            return done(null, result);        //result는 passport.serializeUser의 user로 넘어간다.
        }
        else{
            return done(null, false, {message : '비번이 틀렸습니다.'});
        }
        
    })
}))

 

//쿠키에 세션 등록
passport.serializeUser(function(user, done){
    done(null,user.id);
})

 

//세션데이터를 가진 사람을 db에서 찾기
passport.deserializeUser(function (userid, done){
    db.collection('login').findOne({id: userid}, function(err, result){
        
        done(null,result);
        console.log(result);
    })
    
});

 

 

로그인을 하지 않을 경우 예외처리

app.get('/fail', function (req , res) {
    
    res.send('로그인해주세요');

})

 

login 할경우 mypage보이기 설정
//마이페이지
app.get('/mypage', isLogin,function (req , res) {
    
    res.render('mypage.ejs',{사용자: req.user});

})

//login 할경우 mypage보이기 설정
function isLogin(req, res, next ) {
    if(req.user){
        next();
    }
    else{
        res.send('로그인 해주세요');
    }
}

 

 

mypage.ejs

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>홈입니다.</title>
        <link
            href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
            crossorigin="anonymous">
    </head>
    <body>
        <%- include('nav.html') %>
        <h1 class="ml-2 my-3 text-center">마이페이지입니다!</h1>
        <h1 class="ml-2 my-3 text-center"><%= 사용자.id %>님 반갑습니다.</h1>
        
        <script
            src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
            crossorigin="anonymous"></script>
    </body>
</html>