Back/Node.js

Node.js passport 이용한 구글 로그인

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