설치항목
npm install --save express-session passport passport-local
세가지를 설치해야한다
설정값들에 대한 관리를 위한 dotenv 패키지 설치
npm install --save dotenv
프로젝트 폴더내 .env 파일 생성, 쿠키 비밀키 입력
dotenv 의 config()호출시 env파일의 설정값이 process.env에 저장됌
이후에 process.env.COOKIE_SECRET처럼 설정값들을 사용 할 수 있다.
세션 설정
router.use(session({
resave:false,
saveUninitialized:false,
secret:process.env.COOKIE_SECRET,
cookie:{
httpOnly:true,
secure:false,
}
}));
app.js에 express-session을 적용하면서 쿠키 비밀키를 설정해준다.
cookieParser와 session은 동일한 쿠키 비밀키를 사용해야함
선언들
const passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
const flash = require('connect-flash');
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: false }));
router.use(cookieParser('keyboard cat')); //?
router.use(session({secret: 'keyboard cat'})); //?
router.use(passport.initialize()); //이니셜라이즈 패스포트
router.use(passport.session()); //세션사용 패스포트
router.use(flash()); //메시지 사용
패스포트 사용을 위한 passport 등록 및 LocalStategy
아래 flash는 메시지 출력을 위해 필요하다던데 사용 안하였다
시리얼라이즈 및 디시리얼라이즈
passport.serializeUser(function(user, done) { done(null, id); }); //user.id에 저장 식별값이 .,..로그인시 유저정보 세션에 저장 위해 호출
passport.deserializeUser(function(id, done) {
user_id.findById(id, function(err, user)
{ done(err, user); });
});
passport.use(new LocalStategy) 전략
passport.use(new LocalStrategy({
usernameField:'user_id', //req.body.username
passwordField:'password_hash',//req.body.password
},async function(user_id, password_hash, done){
//로그인시 로직작성할것 아래코드는 예시코드 mysql작성하는거
var sql='select password_hash,user_id from users where user_id like?;';
var params=[user_id];
db.query(sql, params, function(err, rows){
console.log(rows[0]);
if(err) return done(err);
if(rows.length === 0){
console.log("결과 없음");
return done(null, false, { message: 'Incorrect' });
}//에러처리 존나중요해
if(rows[0].password_hash!==password_hash) { console.log('비버니틀려용');
return done(null, false, { message: "pw not found" });
}
if(rows[0].password_hash===password_hash) {console.log('비번이마자용');
var user= rows[0];
return done(null, user); //여기까지 오는거면 위로 디비의 유저아이디 비번이 저장되서 올라감
}
})
}
))
내 db에서는 유저 아이디를 담당하는것이 user_id, 비번이 password_hash이며
sql문에서 유저의 비번과 아이디 순으로 가져오고 그 값을 rows객체에 저장
에러처리가 가장 중요한데 rows의 길이가 0일경우 아이디가 잘못되었다는것 에러처리를 안해주면 서버가 터져버린다
잘못되어도 return하는 done이 필수
그외 객체는 .password라던지 아이디 비밀번호 등 위의 것과 비교하여 아이디만 혹은 비번만 추출이 가능하다
따라서 db비밀번호가 postman으로 받은것과 동일하면 맞고 아니라면 틀린것으로 로그확인 이후 맞을때만 다시 routerpost로 done user를 보낸다 -->rows-->user로 복사한것
router.post
router.post('/login', async function(req, res, next){
//패포실행 ->로그인 로컬
passport.authenticate('local',(authError,user,info)=>{//로컬전략에따른 로그인시도 응답작성
if(authError){
return res.json('user pww not found');
}
if(!user){
return res.json('user id not found');
}
return res.json('check');
}
)(req,res,next);//미들웨어실행
}
);
패스포트의 포스트 부분이다 autherror부분은 아직 어떨때 진입하는건지 모르겠다..
!user일때는 아이디가 안맞을때인데 애초에 맞을때만 위로 올라올수있게 하였는데 저 문구가 어케 출력이 되는건지 잘 모르겠다.
mysql 연동을 통한 회원가입 구현
router.post('/signup', function(req, res) {
user_id= req.body.user_id;
user_pw = req.body.user_pw;
signup_type=req.body.signup_type;
res.json("user_id:"+user_id+","+"user_pw:"+user_pw+","+"signup_type:"+signup_type);
var sql ='insert into users(user_id,password_hash,login_type) values(?,?,?)';
var params=[user_id,user_pw,signup_type];
db.query(sql,params,function(err,rows){
if(err)console.log(err)
})
});
'BackEnd > 로스트아크 Work' 카테고리의 다른 글
DB Node JS 연동 (0) | 2021.08.09 |
---|---|
로스트아크 숙제 프로젝트 3일차 (0) | 2021.06.21 |
로스트아크 숙제 프로젝트 2일차 (0) | 2021.06.21 |
로스트아크 숙제 프로젝트 1일차 (0) | 2021.06.21 |