카카오 로그인은 프론트에서 같이 작업이 필요하다고 생각을 해서 하기 전에 패스포트를 처음 사용해봐서 먼저 어떻게 작동되는지를 이해할 수 있게 로컬 로그인부터 패스포트로 다시 만들었다. 이거는 참고할 자료가 많았고 중간에 콘솔로 다 확인을 할 수 있기에 비교적 쉽게 접근할 수 있었다.
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();
// 이 부분에서 패스포트에 각각의 로그인 인증을 추가해준다
};
중간에 세션의 세션의 직렬화 역직렬화 부분은 나중에 추가적으로 알아볼 필요가 있다.
'오늘 뭐했냐 > 함께했던 작업들' 카테고리의 다른 글
23.08.10 Error Handling (0) | 2023.08.15 |
---|---|
23.08.08 passport-kakao (0) | 2023.08.13 |
23.08.06 쿠키 전달의 문제 (0) | 2023.08.10 |
23.08.05 끝 없는 기획 (0) | 2023.08.10 |
23.07.24 클론 코딩(오늘의집) - 트랜잭션(Transaction) 적용 (0) | 2023.07.26 |