소셜 로그인에 대해서는 아래 링크 참고
[ Server ] Authentication (Session & Cookie / OAuth / JWT) & Transcation
소셜 로그인에 사용되는 메소드들을 활용하기 위해서 다음과 같이 module을 추가적으로 설치해준다.
npm install passport
npm intall passport-kakao
npm install axios
npm install -s express-session
app.use(session({secret: 'SECRET_CODE', resave: true, saveUninitialized: false}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(
'kakao-login',
new KakaoStrategy(
{
clientID: '[REST API 키]',
clientSecret: '[Secret 키]',
callbackURL: '/auth/kakao/callback',
},
function (accessToken, refreshToken, profile, done) {
result = {
accessToken: accessToken,
refreshToken: refreshToken,
profile: profile,
};
console.log('KakaoStrategy', result);
return done;
},
),
);
passport.serializeUser((user, done) => {
done(null, user);
});
passport.deserializeUser((user, done) => {
done(null, user);
});
app.post('/app/login/kakao', user.loginKakao);
app.get('/auth/kakao/callback', passport.authenticate('kakao-login', { failureRedirect: '/auth', successRedirect: '/' }));
exports.loginKakao = async function (req, res) {
const { accessToken } = req.body;
try {
let kakao_profile;
try {
kakao_profile = await axios.get('https://kapi.kakao.com/v2/user/me', {
headers: {
Authorization: 'Bearer ' + accessToken,
'Content-Type': 'application/json',
},
});
} catch (err) {
logger.error(`Can't get kakao profile\n: ${JSON.stringify(err)}`);
return res.send(errResponse(baseResponse.USER_ACCESS_TOKEN_WRONG));
}
const name = kakao_profile.data.kakao_account.profile.nickname;
const email = kakao_profile.data.kakao_account.email;
const emailRows = await userProvider.emailCheck(email);
// 이메일이 존재하는 경우 = 회원가입 되어 있는 경우 -> 로그인 처리
if (emailRows.length > 0) {
const userInfoRows = await userProvider.accountCheck(email);
const token = await jwt.sign(
{
userId: userInfoRows[0].id,
},
secret_config.jwtsecret,
{
expiresIn: '365d',
subject: 'userId',
},
);
const result = { userId: userInfoRows[0].id, jwt: token };
return res.send(response(baseResponse.SUCCESS, result));
// 이메일이 존재하지 않는 경우 -> 회원가입 처리
} else {
const result = {
name: name,
email: email,
loginStatus: 'KAKAO',
};
const signUpResponse = await userService.createSocialUser(
name,
email,
result.loginStatus,
);
return res.send(response(baseResponse.SUCCESS, result));
}
} catch (err) {
logger.error(`App - logInKakao Query error\n: ${JSON.stringify(err)}`);
return res.send(errResponse(baseResponse.USER_INFO_EMPTY));
}
};
이전에 쓴 글에서 보면 알 수 있듯이 소셜 로그인은 다른 서버로부터 Access Token을 받아서 접속을 원하는 서버로 클라이언트가 보낸다. 모든 준비가 되었으니 Access Token을 발급 받아보자.