inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Vue로 Nodebird SNS 만들기

로그인 관련

222

Harry Jung

작성한 질문수 6

0

요즘 자주 질문드리네요~ :)

해당 강좌를 질문을 통해서 무사히~ 로컬 회원가입, 로그인, 로그아웃이 되어서 SNS 로그인으로 넘어가고 있습니다.

express passport를 이용한 google 인을 하고 싶어서 만들어봤는데 뭔가 하나가 부족해서 질문 남깁니다.

인터넷 stackoverflow에서 자료가 너무 없어서 passport.org에서도 자료를 최대한 찾아봤는데 해결이 안되네요..

제 생각에는 

1. HTML 에서 <a href=''> Google login </a> 로 트리거 하고

2. backend에서 get('/google') 로 들어오면 해당 scope를 가지고 패스포트로 strategy로 보낸 후

3.  인증 처리 이후 관련 user 정보를 google에서 받고 

4. user 정보를  내 database에 저장한 후

5. 콜백 처리후 redirect로 프론트로 보내서

6. nuxtServerInit 함수로 db에 저장된 것을 불러와 store에 다시 저장후 로그인 인증을 유지한다.

여기까지 인데~ 문제점이 많습니다. 

4번에 database 저장하는 것이 패스워드가 없어서 기존에 있던 User Model이 (nickname, email, password)인데

password를 넣을수가 없어서 에러가 납니다.  그래서 임의로 1111을 넣었는데 작동은 잘되는데 이건 아닌 것 같아서~ 어떻게 해야 하는지 모르겠네요. 관련 자료에 대해서 zerocho.com의 facebook을 봤는데 조금 달라서 잘 되지 않고 있습니다. Facebook 도 해보고 싶은데 제가 하는 방식과는 조금 달라서 난감한 상황이라 문의 드립니다.  

1. backend/routes/auth.js

const express = require('express');
const bcrypt = require('bcrypt');
const passport = require('passport');
const db = require('../models');
const { isLoggedIn, isNotLoggedIn } = require('./middlewares');

const router = express.Router();

router.get('/', (req, res)=>{res.send('logout')})
router.get('/failed', (req, res)=>{res.send('failed to log in')})
router.get('/good', isLoggedIn, (req, res)=>{
res.redirect('http://localhost:3000/setup')
res.send(`welcome to ${req.user.displayName}`)
})

//1. a tag 를 통해서 '/google' 로 오면 passport-setup.js 로 profile 정보를 가지고 감(id, password, email)
router.get('/google', passport.authenticate('google', { scope: ['profile', 'email'] }));


//6 req.user 정보가 안생기면 '/auth/failed', 정보가 생기면 '/auth/good' 으로 redirect 됨
router.get('/google/callback', passport.authenticate('google', { failureRedirect: '/auth/failed' }),
function(req, res) {
console.log(req.user)
res.redirect('/auth/good')
});

router.get('/google/logout', (req, res)=>{
req.session = null
req.logout()
res.redirect('/')
})

2. backend/passport/passport-setup.js

const passport = require('passport');
const User = require('../models/User');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const db = require('../models/')
const bcrypt = require('bcrypt')

//4 구글 아이디를 들고 쿠키를 싦음
passport.serializeUser(function(user, done){
done(null, user)
})

// 5 user 정보를 보내줌 req.user
passport.deserializeUser(async (user, done)=>{
try{
const newUser = await db.User.findOrCreate({
where:{
email: user.emails[0].value,
username: user.displayName,
password: '1111'
}
})
return done(null, user)
}catch(error){
console.log(error)
return done(error)
}
})


// passport.deserializeUser(function(user, done){
// console.log('google-user', user)
// done(null, user) // req.user
// })


//2 '/google'에서 넘어옴 아이디 패스워드 체크 후 인증이 되면 callback URL로 보내줌
passport.use(new GoogleStrategy({
clientID: "28194224462-job5pv0aswefef3s2hjqlf57tsdfsdflv956ko2r5hr.apps.googleusercontent.com",
clientSecret: "lfj_aYTi6zgXe4nwefBHF1dpwefewfewfYyq",
callbackURL: "http://localhost:3085/auth/google/callback"
},

//3 구글 인증이 되면 해당 프로필로 구글 아이디를 User Db에서 받아옴 그리고 done으로 user 값을 받거나 err 나면 error를 보내줌
function(accessToken, refreshToken, profile, done) {
return done(null, profile);
}
));

backend/app.js

//------------------------------------------------//
// BACKEND/FRONT PORT
//------------------------------------------------//
const backPort = '3085'
const frontPort = '3000'


const express = require('express')
const db = require('./models')
const cors = require('cors')
const morgan = require('morgan')

//------------------------------------------------//
// ROUTER REQUIRE
//------------------------------------------------//
const userRouter = require('./routes/user')
const authRouter = require('./routes/auth')
// const widgetRouter= require('./routes/widget')
// const imageRouter = require('./routes/image')
// const databaseRouter = require('./routes/database')
// const postRouter = require('./routes/post')
// const loadPostRouter = require('./routes/loadPost')

//------------------------------------------------//
// PASSPORT MODULE
//------------------------------------------------//
const passport = require('passport')
const passportConfig = require('./passport')
const session = require('express-session')
const cookie = require('cookie-parser')
require('./passport/passport-setup')
require('./passport/passport-facebook')

const app = express()
app.use(morgan('dev'))

db.sequelize.sync({force:true} ) // db 실행 {force:true}


app.use(express.json()) // express 가 json을 받기 위함
app.use(express.urlencoded( {extended: false}))

// passport
app.use(session({
resave: false,
saveUninitialized: false,
secret: 'ns747800',
cookie: {
httpOnly: true,
secure: false,
}
}))

app.use(cookie('ns747800'))
app.use(passport.initialize())
app.use(passport.session())
passportConfig()



//------------------------------------------------//
// CORS FRONTEND PORT
//------------------------------------------------//

app.use(cors({
origin: `http://localhost:${frontPort}`,
credentials: true
}))

//------------------------------------------------//
// IMAGE STATIC FILES
//------------------------------------------------//

app.use('/', express.static('uploads'));


//------------------------------------------------//
// ROUTER API
//------------------------------------------------//

app.get('/', (req,res)=>{ res.send('hello wizeto') })
app.use('/user', userRouter)
app.use('/auth', authRouter)
// app.use('/image', imageRouter)
// app.use('/widget', widgetRouter)

// app.use('/database', databaseRouter)
// app.use('/post', postRouter)
// app.use('/loadpost', loadPostRouter)





//------------------------------------------------//
// LISTEN
//------------------------------------------------//
app.listen(backPort,()=>{ console.log(`YES backend server is ${backPort}`) })

조금 자세히 설명해주시면 감사하겠습니다.~~~ vue - express - passport - google  관련 너무 자료가 없어요...

nodejs mysql aws vuex vuejs ssr

답변 1

0

제로초(조현영)

일단 하나씩 해결해보는 게 좋을 것 같습니다. password는 없는 게 맞습니다. 비밀번호 컬럼이 필수로 되어있으신 것 같은데 선택으로 바꾸시면 됩니다.

npm run dev 할 때 에러가 발생합니다.

0

143

1

해당 강의는 리뉴얼 예정은 따로 없나요?

0

326

1

강의는 언제까지 업데이트 된 내용인가요?

0

328

2

실습 환경 문의(Node 버전)

0

363

1

로그인 새로고침시 풀림

0

289

1

안녕하세요! 로그인 유지 질문 드립니다!

0

401

1

웹 서버 관련해서 질문드립니다.

0

439

1

버전때매 질문 드립니다!!

0

311

1

이 강의는 vue3는 아닌가요??

0

370

1

vsCode에 관한 질문입니다

0

487

1

v.trim()이 타입에러가 뜹니다...

0

341

1

express.static('uploads')

0

341

2

STRING이 인식이 안되는데 이유알수있을까요?

0

444

2

<v-lsit-item-title> 에러

0

407

2

vue cli 를 실무에서도 사용하지 않으시나요?

0

317

1

선생님 처음 환경 셋팅 관련 문의드립니다.

0

383

1

nuxtServerInit 무한 로딩

0

971

3

Nginx Cookie 설정

0

720

2

상태가 204번인경우에는 어떻게 처리를 해야하나요?

0

290

1

선생님 nuxt 관련질문드립니다.

0

347

1

인덱스 비교로 삭제해도 될까요?

0

381

1

질문 드립니다!

0

329

2

안녕하세요

0

224

1

궁금한점이있습니다

0

234

1