node 진영에서 소셜 로그인 (oauth2)을 구현한다고 하면
보통 passport를 사용한다.
일반적인 로그인의 경우
passport.authenticate를 사용한다.
가끔 어떤 서비스들을 보면
마이페이지에서 다른 소셜을 연동하는 버튼이 있는 것을 알수 있는데
연동을 구현하면서 알게된 것을 적어본다.
authenticate 메소드는 로그인이 성공하는 경우
내부적으로 req.login을 호출하여 req.user에 세션을 저장한다.
그런데
(req, res, next) => {
passport.authorize(
KAKAO_CONNECT_STRATEGY,
{
failureRedirect: `${BASE_URL}/login/fail`,
session: true
},
(err, user, info) => {
if (err) {
console.error(err);
res.redirect(`${BASE_URL}/login/fail`);
return;
}
req.logIn(user, (_err) => {
if (_err) {
return next(_err);
}
console.log("user :", user);
console.log("info :", info);
next();
});
...
와 같이 콜백을 넣어주는 경우
수동으로 req.login을 호출하여 세션을 넘겨줘야 한다.
authorize로 연동을 하게되면
기존 로그인된 유저는 req.user에 남아있고
연동한 유저는 req.account에 저장이된다.
passport.use에서
전략을 구현할 때
옵션으로 passReqToCallback: true
를 주면
req 파라미터로 세션을 받아와 사용할 수 있다.
console.log(req.user)