[TIL]
[TIL] 2024.02.14 passport-kakao
재호링
2024. 2. 14. 02:53
passport-kakao
passport-naver와 동작원리는 비슷하다.
app.get('/auth/kakao', passport.authenticate('kakao', { state: 'myStateValue' }));
먼저 라우터를 통해 /kakao 로그인 요청을 받고 카카오 로그인 페이지로 이동되는 코드다.
app.get(
'/auth/kakao/callback',
passport.authenticate('kakao', {
failureRedirect: '/',
}),
(req, res) => {
res.redirect('/');
}
);
이후 /auth/kakao/callback URL 경로로 값을 전달해주고
passport.use(
new KakaoStrategy(
{
clientID: clientKakaoID,
clientSecret: clientKakaoSecret,
callbackURL: callbackKakaoURL,
},
async (accessToken, refreshToken, profile, done) => {
console.log(
'KakaoProfile',
'accessToken',
accessToken,
'refreshToken',
refreshToken,
profile
);
console.log(profile);
이 안에 카카오에서 보내준 계정 정보가 찍히게 되는거다.
const exUser = await prisma.users.findFirst({
where: {
email: kakaoEmail,
}
})
if(exUser) {
done(null, exUser);
} else {
const newUser = await prisma.users.create({
data: {
clientId: kakaoId.toString(),
email: kakaoEmail,
name: kakaoDisplayName,
},
});
done(null, newUser);
}
여기서 에러처리를 해줬다.
네이버 로그인때도 발생하던 문제였는데,
findFirst를 활용해 회원가입한 이력이 있는지 email을 체크해
회원가입이 되어 있어 사용자 정보를 호출하고 종료되게 만들고,
회원가입이 안되어 있을 경우 정보를 db에 저장해 회원가입이 되게 만들었다.
Unique constraint failed on the constraint: `Users_email_key`
at ai.handleRequestError
원래 exUser를 만들지 않았을 때는 위와 같은 에러를 동반했는데 해결했다.