passport, cookie-parser, express-session 등의 설정은 로컬 로그인 참고
구글 로그인 전략에 대한 공식문서
npm install passport-google-oauth20
routes/user.js
...
// 구글 로그인
router.get(
"/google/auth",
isNotLoggedIn,
passport.authenticate("google", {
scope: ["email"],
})
);
router.get(
"/google/callback",
passport.authenticate("google", {
failureRedirect: "/",
}),
function (req, res) {
res.redirect(process.env.FRONT_END_DOMAIN);
}
);
...
passport 구글 소셜 로그인은 두개의 API가 필요하다
passport/googleStrategy.js
const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth20").Strategy;
const { User } = require("../models");
const dotenv = require("dotenv");
dotenv.config();
module.exports = () => {
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: `${process.env.BACK_END_DOMAIN}/user/google/callback`,
scope: ["profile", "email"],
state: true,
},
async (accessToken, refreshToken, profile, done) => {
console.log("google profile", profile);
try {
const exUser = await User.findOne({
where: { snsId: profile.id, provider: "google" },
});
if (exUser) {
done(null, exUser);
} else {
const newUser = await User.create({
email: profile._json && profile._json.email,
password: "",
nickname: profile.emails[0].value,
introduce: "",
provider: "google",
snsId: profile.id,
});
done(null, newUser);
}
} catch (error) {
console.error(error);
done(error);
}
}
)
);
};
공식문서 가이드를 바탕으로 googleStrategy를 작성한다
app.get('/auth/google/callback',
passport.authenticate('google', { failureRedirect: '/login' }),
function(req, res) {
var state = req.authInfo.state;
// 재개 상태...
});
구글 로그인 버튼은 href
를 이용해 만들어야 정상적으로 작동한다.
<a href={`${process.env.NEXT_PUBLIC_BACK_END_DOMAIN}/user/google/auth`}>
<img
src={`${process.env.NEXT_PUBLIC_FRONT_END_DOMAIN}/images/google-auth-image.png`}
></img>
</a>
google에 로그인한 후 google developer console에 접속해 프로젝트를 생성한다.
좌측메뉴에 OAuth 동의 화면 클릭
사용자 유형 외부로 되어있는지 확인
좌측메뉴 사용자 인증 정보 클릭
브라우저 URI, 리디렉션 URI를 등록한다.