Nodejs passport 이용한 구글 로그인
// 임포트할 것. cookie는 꼼수로 강제 토큰 전달 하기 위해서 넣었음..
const cookie = ("cookie-parser");
const session = require('express-session');
const passport = require("passport");
const GoogleStrategy = require('passport-google-oauth20').Strategy;
// 얘넨 왜 있는걸까 ^^? 막 안되다가 얘네 붙여넣으니까 됐음
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (user, done) {
done(null, user);
});
//
// A
passport.use(
new GoogleStrategy(
{
clientID: "하하하 난 바보야 하핳ㅎ하하하",
clientSecret: "안녕~~",
callbackURL: `http://localhost:3000/google/callback`
},
async (accessToken, refreshToken, profile, cb) => {
// console.log("====받아온 profile ======")
// console.log(profile)
// console.log("====받아온 cd ======")
// console.log(cb)
const {
// _json: { id, avatar_url, login: name, email }
_json: { id, avatar_url, name, email }
} = profile
// console.log("====내려 받은 profile ======")
// console.log(profile)
try {
const user = await User.findOne({ email: email })
//동일한 이메일을 가졌을 때는 이미 가입중인 사용자라면 바로 로그인하도록 아니라면 신규 사용자 생성
if (user) {
// user.githubId = id
// user.save()
return cb(null, user)
} else {
const newUser = await User.create({
email,
nickname: name,
githubId: id,
avatarUrl: avatar_url
})
// return cb(null, newUser)
}
return cb(null, user)
} catch (error) {
return cb(error)
}
}
))
// B
app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));
// C
app.get('/google/callback',
passport.authenticate('google', { failureRedirect: '/login' }),
function (req, res) {
console.log("여기가 유저")
console.log(req.user)
const { _id } = req.user
// Successful authentication, redirect home.\
const userGoogle = User.findOne({ _id }).exec();
const token = jwt.sign({ userId: userGoogle.userId }, "my-key");
// res.send(token)
res.cookie("token", token)
res.redirect('/home');
});
일단.. 클라이언트한테 요청을 받으면,
1. B를 탄다.
B를 타면 google에 요청을 하고, 그 범위는 profile과 email을 달라고 요청한다.
2. 그리고 A에 가서 검증하고, 원하는 자료들을 받아낸다. 그 과정에서, 내 DB에 들어온 구글유저 정보를 대조해서 DB에 없으면 넣거나, 있으면 바로 로그인시키는 등의 작업을 한다.
3. C에 와서, 구글쪽에서 준 token이 아니라 내 시크릿키로 자체 제작한 jwt-token을 클라이언트한테 건네준다.
이 과정에서 axios나 ajax가 왜 안되징? 왜 왜왜왱왜ㅔ오에 왜 안되징? 하면서 res.send로 token을 보낼 수 없어서,
찾다가.. 강제로 토큰을 찔러주면 되지 않을까? 해서 res.cookie로 token을 강제로 찔러주니까, 클라이언트한테 내가 만든 token이 들어가긴 들어갔다.
그리고 res응답은 하나의 요청에 하나의 응답만 가능한 줄 알고있었는데, res.cookie랑 res.redirect 둘 다 먹혔다. 거짓말쟁이들
사실 잘 모르지만, 나중에 프론트분들이랑 작업할 때 바꿔봐야겠다. 일단은 되니까.. 패쓰 ^^ㅋ
'Back > Node.js' 카테고리의 다른 글
Node.js 검색 기능 (0) | 2021.05.11 |
---|---|
Node.js 유저인증 미들웨어 (0) | 2021.04.12 |
Node.js 친구가 쓴 글만 내려주기 [MongoDB] (0) | 2021.04.08 |
Node.js 좋아요, MongoDB (0) | 2021.04.08 |
Nodejs 친구목록 친구추가 (0) | 2021.04.03 |