오늘 뭐했냐/함께했던 작업들

23.08.07 passport-local

스스로에게 2023. 8. 12. 05:55

 카카오 로그인은 프론트에서 같이 작업이 필요하다고 생각을 해서 하기 전에 패스포트를 처음 사용해봐서 먼저 어떻게 작동되는지를 이해할 수 있게 로컬 로그인부터 패스포트로 다시 만들었다. 이거는 참고할 자료가 많았고 중간에 콘솔로 다 확인을 할 수 있기에 비교적 쉽게 접근할 수 있었다. 

 usernameField: 'loginId', // req.body.loginId
 passwordField: 'password' // req.body.password

처음에 정보를 body의 정보를 어떻게 가져오지 했는데 위에 코드가 그 역할을 해준다. 

// localStrategy.js
...
async (loginId, password, done) => {
...
// done에서 결과를 처리한다. 
// done(error, user, info)
return done(null, { user, accessToken }); 
// 이렇게 값을 전달해서 


// login.route.js
router.post('/', passport.authenticate('local', { session: false }), (req, res) => {
    // done의 값이 req.user 이렇게 전달되어 사용할 수 있다. 
    // 저는 localStrategy.js에서 토큰생성
    res.cookie("MM", `Bearer ${req.user.accessToken}`, {
        secure: true,
        httpOnly: true,
        sameSite: "none",
    });
    res.status(200).json({ message: "로그인 완료" });
});

 

passport.authenticate 미들웨어에서 인증 방식을 결정하면서 기본값으로 세션에 인증된 사용자 정보를 저장한다. 나는 JWT 토큰을 사용할 것이기에 { session: false } 옵션을 통해 세션 사용을 하지 않았다. 

 

추가로 패스포트를 모아서 관리했다.

// index.passport.js

const passport = require('passport');
const local = require('./localStrategy'); // 로컬서버로 로그인할때
const kakao = require('./kakaoStrategy'); // 카카오서버로 로그인할때
const { Users } = require('../models')

module.exports = () => {

    passport.serializeUser((user, done) => {
        done(null, user.id);
    });
    
    passport.deserializeUser((id, done) => {
        Users.findOne({ where: { id } })
            .then(user => {
                if (!user) {
                    return done(null, false);
                }
                done(null, user); 
            })
            .catch(err => done(err));
    });

    local();
    kakao();
    // 이 부분에서 패스포트에 각각의 로그인 인증을 추가해준다
};

 

중간에 세션의 세션의 직렬화 역직렬화 부분은 나중에 추가적으로 알아볼 필요가 있다.