node js 로그인

HR·2022년 4월 10일
0

1. routes 폴더 안에 auth.js 파일 생성

2. 라우터 만들었으니 app.js에 다음 두 줄 삽입해놓기

const authRouter = require('./routes/auth')
~
~
app.use('/auth', authRouter);

3. 실제 로그인 전략(strategy)는 따로 localStrategy.js 파일을 작성 (카카오는 kakaoStrategy.js)

4. 큰 흐름

  1. 프론트에서 로그인 요청을 하며 id와 pw를 넘겨주면 auth.js의 /login 라우터가 실행됨
  2. 라우터의 local을 읽은 뒤 localStrategy로 넘어가서 실행
  3. localStrategy의 done함수를 읽으면 다시 auth.js의 passport.authenticate의 두번째 인자로 넘어옴
  4. req.login을 읽는 순간 passport 폴더의 index.js로 이동
  5. serializeUser에서 user의 id만 뽑아서 done 함수를 실행

done 함수
-> done(1, 2, 3)

  • 1번 인자: server error, 일반적으로는 null을 넣고 에러인 경우는 try-catch로 따로 처리
  • 2번 인자: 로그인 성공한 경우의 객체, 실패했다면 false, 성공했다면 해당 객체
  • 3번 인자: 로그인 실패 시의 메세지

5. 로그아웃

router.post('/logout', isLoggedIn, (req, res) => {
   req.logout();
   req.session.destroy();
   res.redirect('/');
});

logout 라우터 만들고 req.logout 하면 서버에서 세션 쿠키가 사라짐 (서버에서 세션 쿠키가 사라지면 로그인이 풀리는 것과 동일)

6. isLoggedIn, isLoggedOut 미들웨어 (직접 구현)

로그인 한 상태로 회원가입을 진입하고, 로그인이 안돼있는데 로그아웃을 하는 등의 예외상황을 만들지 않기 위한 미들웨어를 직접 구현한 뒤 auth.js의 각 라우터들에 삽입

//middleware를 직접 만들기

//지금 로그인 상태인지 판단
exports.isLoggedIn = (req, res, next) => {
    if(req.isAuthenticated()) { //true면 로그인 되어있는 상태임
        next();
    }
    else {
        res.status(403).send('로그인 필요');
    }
}

//로그인 안한 상태인지 판단
exports.isNotLoggedIn = (req, res, next) => {
    if(!req.isAuthenticated()) {
        next();
    } 
    else {
        const message = encodeURIComponent('로그인한 상태입니다.');
        res.redirect(`/?error=${message}`);
    }
};

카카오로 로그인하기 는 따로 글을 작성했다


모바일 환경 (android, ios)에서는 쿠키를 사용할 수 없다. 따라서 직접 구현해서 사용해야 함!!!

  • 토큰을 이용해야 한다. REST API와 jwt를 이용함.

0개의 댓글