작성
·
305
0
local의 경우,
passport.use(
new LocalStrategy(
{
usernameField: "email", // req.body.email
passwordField: "password", // req.body.password
},
async (email, password, done) => {
try {
const exUser = await User.findOne({ where: { email } });
if (exUser) {
const result = await bcrypt.compare(password, exUser.password);
if (result) {
done(null, exUser);
} else {
done(null, false, { message: "비밀번호가 다릅니다." });
}
} else {
done(null, false, { message: "가입되지 않은 회원입니다." });
}
} catch (e) {
console.error(e);
done(e);
}
}
)
);
에서 done이 실행되면,
authRouter.post("/login", (req, res, next) => {
passport.authenticate("local", (err, user, info) => {
if (err) {
console.error(err);
return next(err);
}
if (!user) {
return res.redirect("/login");
}
return req.login(user, (err) => {
if (err) {
console.error(err);
return next(err);
}
// 여기서 { id : 3, "connect.sid" : s%31241432525 }에 저장된 cookie를 브라우저로 보냄
return res.redirect("/");
});
})(req, res, next);
});
passport.authenticate의 콜백함수로 이동한다고 이해했습니다.
oauth의 경우,
passport.use(
new KakaoStrategy(
{
clientID: process.env.KAKAO_ID,
callbackURL: "/auth/kakao/callback",
},
async (accessToekn, refreshToken, profile, done) => {
try {
const exUser = await User.findOne({
where: { snsId: profile.id, provider: "kakao" },
});
if (exUser) {
done(null, exUser);
} else {
const newUser = await User.create({
email: profile._json && profile._json.kakao_account_email,
nick: profile.displayName,
snsId: profile.id,
provider: "kakao",
});
done(null, newUser);
}
} catch (e) {
console.error(e);
done(e);
}
}
)
);
에서 done이 실행되면 마찬가지로 done을
(err, user, info) => {}
와 같은 콜백방식으로 받아야 하지 않나요? 미들웨어 확장법을 사용하지 않고
authRouter.get(
"/kakao/callback",
passport.authenticate(
"kakao",
{
failureRedirect: "/login",
},
(req, res) => {
res.redirect("/");
}
)
);
방법이 가능한 이유가 궁금합니다.
답변 1
1
이게 설명하기가 좀 난감한데요. 애초에 그렇게 만들어졌기 때문입니다.
passport-kakao같은 것은 done이 호출되었을 때 에러가 없다면 (req, res) => {} 로 이동합니다. req.login같은 것은 passport-kakao 내부에서 처리해버렸기 때문입니다.