로그인 관련
2020-11-30T13:22:41.819Z
222
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 관련 너무 자료가 없어요...
답변 1
0
일단 하나씩 해결해보는 게 좋을 것 같습니다. password는 없는 게 맞습니다. 비밀번호 컬럼이 필수로 되어있으신 것 같은데 선택으로 바꾸시면 됩니다.
npm run dev 할 때 에러가 발생합니다.
해당 강의는 리뉴얼 예정은 따로 없나요?
강의는 언제까지 업데이트 된 내용인가요?
실습 환경 문의(Node 버전)
로그인 새로고침시 풀림
안녕하세요! 로그인 유지 질문 드립니다!
웹 서버 관련해서 질문드립니다.
버전때매 질문 드립니다!!
이 강의는 vue3는 아닌가요??
vsCode에 관한 질문입니다
v.trim()이 타입에러가 뜹니다...
express.static('uploads')
STRING이 인식이 안되는데 이유알수있을까요?
<v-lsit-item-title> 에러
vue cli 를 실무에서도 사용하지 않으시나요?
선생님 처음 환경 셋팅 관련 문의드립니다.
nuxtServerInit 무한 로딩
Nginx Cookie 설정
상태가 204번인경우에는 어떻게 처리를 해야하나요?
선생님 nuxt 관련질문드립니다.
인덱스 비교로 삭제해도 될까요?
질문 드립니다!
안녕하세요
궁금한점이있습니다