프로그래밍/Node.js

Node.js 생활코딩 정리 – CRUD + Auth MYSQL버전을 여러개의 파일로 나누기 1

가카리 2016. 12. 13. 22:20
반응형

CRUD + Auth mysql 버전을 여러개의 파일로 나누기1

 

app_multi_user_mysql3.js 작업 중

 

html 소스를 jade로 바꾸기 귀찮으면

 

다음 사이트를 이용하자(html2jade.org)

 

 

 

처음에는 login페이지와 register 페이지를 jade로 분할해보자

 

/views/mysql/auth/login.jade

 

h1 Login

form(action='/auth/login', method='post')

p

input(type='text', name='username', placeholder='username')

p

input(type='password', name='password', placeholder='password')

p

input(type='submit')

a(href='/auth/facebook') facebook

 

 

/views/mysql/auth/register.jade

 

h1 Register

form(action='/auth/register', method='post')

p

input(type='text', name='username', placeholder='username')

p

input(type='password', name='password', placeholder='password')

p

input(type='text', name='displayName', placeholder='displayName')

p

input(type='submit')

 

 

app_multi_user_mysql3.js

 

수정된 곳은 노란색으로 표시 완료

 

var express = require('express');

var session = require('express-session');

var MySQLStore = require('express-mysql-session')(session);

var bodyParser = require('body-parser');

var bkfd2Password = require("pbkdf2-password");

var passport = require('passport');

var LocalStrategy = require('passport-local').Strategy;

var FacebookStrategy = require('passport-facebook').Strategy;

var hasher = bkfd2Password();

var mysql = require('mysql');

var conn = mysql.createConnection({

host : 'localhost',

user : 'root',

password : 'qwer1234',

database : 'o2',

port : 3307

});

conn.connect();

var app = express();

app.set('views', './views/mysql');//jade 파일 루트

app.set('view engine', 'jade');//템플릿 엔진을 jade 명시함//jade 파일 루트

 

app.use(bodyParser.urlencoded({ extended: false }));

app.use(session({

secret: '1234DSFs@adf1234!@#$asd',

resave: false,

saveUninitialized: true,

store:new MySQLStore({

host:'localhost',

port:3307,

user:'root',

password:'qwer1234',

database:'o2'

})

}));

app.use(passport.initialize());

app.use(passport.session());

app.get('/count', function(req, res){

if(req.session.count) {

req.session.count++;

} else {

req.session.count = 1;

}

res.send('count : '+req.session.count);

});

app.get('/auth/logout', function(req, res){

req.logout();

req.session.save(function(){

res.redirect('/welcome');

});

});

app.get('/welcome', function(req, res){

if(req.user && req.user.displayName) {

res.send(`

<h1>Hello, ${req.user.displayName}</h1>

<a href="/auth/logout">logout</a>

`);

} else {

res.send(`

<h1>Welcome</h1>

<ul>

<li><a href="/auth/login">Login</a></li>

<li><a href="/auth/register">Register</a></li>

</ul>

`);

}

});

passport.serializeUser(function(user, done) {

console.log('serializeUser', user);

done(null, user.authId);

});

passport.deserializeUser(function(id, done) {

console.log('deserializeUser', id);

var sql = 'SELECT * FROM users WHERE authId=?';

conn.query(sql, [id], function(err, results){

if(err){

console.log(err);

done('There is no user.');

} else {

done(null, results[0]);

}

});

});

passport.use(new LocalStrategy(

function(username, password, done){

var uname = username;

var pwd = password;

var sql = 'SELECT * FROM users WHERE authId=?';

conn.query(sql, ['local:'+uname], function(err, results){

if(err){

return done('There is no user.');

}

var user = results[0];

return hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash){

if(hash === user.password){

console.log('LocalStrategy', user);

done(null, user);

} else {

done(null, false);

}

});

});

}

));

passport.use(new FacebookStrategy({

clientID: '381822035542311',//개발자 페이지에서 APP ID

clientSecret: '5f8d7e59b8701fa64cf7343ebe8c0d8a',//개발자 페이지에서 App Secret 입력

callbackURL: "/auth/facebook/callback",//다음 콜백 페이지

profileFields:['id', 'email', 'gender', 'link', 'locale',

'name', 'timezone', 'updated_time', 'verified', 'displayName']

},

function(accessToken, refreshToken, profile, done) {

console.log(profile);

var authId = 'facebook:'+profile.id;

var sql = 'SELECT * FROM users WHERE authId=?';

conn.query(sql, [authId], function(err, results){

if(results.length>0){//사용자가 존재하면

done(null, results[0]);

}else{//사용자가 없다면 사용자를 추가해야함

var newuser = {

'authId':authId,

'displayName':profile.displayName,

'email':profile.emails[0].value

};

var sql = 'INSERT INTO users SET ?';

conn.query(sql, newuser, function(err, results){

if(err){

console.log(err);

done('Error');

}else{//로그인 성공시

done(null, newuser);

}

});//쿼리문 완료

}//if 완료

});//쿼리문완료

}//function 완료

));

app.post(

'/auth/login',

passport.authenticate(

'local',

{

successRedirect: '/welcome',

failureRedirect: '/auth/login',

failureFlash: false

}

)

);

app.get(

'/auth/facebook',

passport.authenticate(

'facebook',

{scope:'email'}

)

);

app.get(

'/auth/facebook/callback',

passport.authenticate(

'facebook',

{

successRedirect: '/welcome',

failureRedirect: '/auth/login'

}

)

);

// var users = [

// {

// authId:'local:egoing',

// username:'egoing',

// password:'mTi+/qIi9s5ZFRPDxJLY8yAhlLnWTgYZNXfXlQ32e1u/hZePhlq41NkRfffEV+T92TGTlfxEitFZ98QhzofzFHLneWMWiEekxHD1qMrTH1CWY01NbngaAfgfveJPRivhLxLD1iJajwGmYAXhr69VrN2CWkVD+aS1wKbZd94bcaE=',

// salt:'O0iC9xqMBUVl3BdO50+JWkpvVcA5g2VNaYTR5Hc45g+/iXy4PzcCI7GJN5h5r3aLxIhgMN8HSh0DhyqwAp8lLw==',

// displayName:'Egoing'

// }

// ];

app.post('/auth/register', function(req, res){

hasher({password:req.body.password}, function(err, pass, salt, hash){

var user = {

authId:'local:'+req.body.username,

username:req.body.username,

password:hash,

salt:salt,

displayName:req.body.displayName

};

var sql = 'INSERT INTO users SET ?';

conn.query(sql, user, function(err, results){

if(err){

console.log(err);

res.status(500);

} else {

req.login(user, function(err){

req.session.save(function(){

res.redirect('/welcome');

});

});

}

});

});

});

app.get('/auth/register', function(req, res){

res.render('auth/register');

});

app.get('/auth/login', function(req, res){

res.render('auth/login');

});

app.listen(3003, function(){

console.log('Connected 3003 port!!!');

});

 

 

그다음 소스 개선 방법 /auth로 시작하는 라우팅을 한곳에 모으자

 

/routes/mysql/auth.js

 

module.exports = function(passport){//넘겨진 패스포트를 받음

var route = require('express').Router();//app route 바꿔야됨

 

 

route.get('/logout', function(req, res){

req.logout();

req.session.save(function(){

res.redirect('/welcome');

});

});

 

route.post(

'/login',

passport.authenticate(

'local',

{

successRedirect: '/welcome',

failureRedirect: '/login',

failureFlash: false

}

)

);

route.get(

'/facebook',

passport.authenticate(

'facebook',

{scope:'email'}

)

);

route.get(

'/facebook/callback',

passport.authenticate(

'facebook',

{

successRedirect: '/welcome',

failureRedirect: '/login'

}

)

);

 

 

// var users = [

// {

// authId:'local:egoing',

// username:'egoing',

// password:'mTi+/qIi9s5ZFRPDxJLY8yAhlLnWTgYZNXfXlQ32e1u/hZePhlq41NkRfffEV+T92TGTlfxEitFZ98QhzofzFHLneWMWiEekxHD1qMrTH1CWY01NbngaAfgfveJPRivhLxLD1iJajwGmYAXhr69VrN2CWkVD+aS1wKbZd94bcaE=',

// salt:'O0iC9xqMBUVl3BdO50+JWkpvVcA5g2VNaYTR5Hc45g+/iXy4PzcCI7GJN5h5r3aLxIhgMN8HSh0DhyqwAp8lLw==',

// displayName:'Egoing'

// }

// ];

route.post('/register', function(req, res){

hasher({password:req.body.password}, function(err, pass, salt, hash){

var user = {

authId:'local:'+req.body.username,

username:req.body.username,

password:hash,

salt:salt,

displayName:req.body.displayName

};

var sql = 'INSERT INTO users SET ?';

conn.query(sql, user, function(err, results){

if(err){

console.log(err);

res.status(500);

} else {

req.login(user, function(err){

req.session.save(function(){

res.redirect('/welcome');

});

});

}

});

});

});

route.get('/register', function(req, res){

res.render('auth/register');

});

route.get('/login', function(req, res){

res.render('auth/login');

});

 

return route;

};

 

 

 

app_multi_user.mysql3.js

 

var express = require('express');

var session = require('express-session');

var MySQLStore = require('express-mysql-session')(session);

var bodyParser = require('body-parser');

var bkfd2Password = require("pbkdf2-password");

var passport = require('passport');

var LocalStrategy = require('passport-local').Strategy;

var FacebookStrategy = require('passport-facebook').Strategy;

var hasher = bkfd2Password();

var mysql = require('mysql');

var conn = mysql.createConnection({

host : 'localhost',

user : 'root',

password : 'qwer1234',

database : 'o2',

port : 3307

});

conn.connect();

var app = express();

app.set('views', './views/mysql');//jade 파일 루트

app.set('view engine', 'jade');//템플릿 엔진을 jade 명시함//jade 파일 루트

 

app.use(bodyParser.urlencoded({ extended: false }));

app.use(session({

secret: '1234DSFs@adf1234!@#$asd',

resave: false,

saveUninitialized: true,

store:new MySQLStore({

host:'localhost',

port:3307,

user:'root',

password:'qwer1234',

database:'o2'

})

}));

app.use(passport.initialize());

app.use(passport.session());

 

//app. 선택후 컨트롤+d 하고 변경하면 바뀜

app.get('/count', function(req, res){

if(req.session.count) {

req.session.count++;

} else {

req.session.count = 1;

}

res.send('count : '+req.session.count);

});

 

app.get('/welcome', function(req, res){

if(req.user && req.user.displayName) {

res.send(`

<h1>Hello, ${req.user.displayName}</h1>

<a href="/auth/logout">logout</a>

`);

} else {

res.send(`

<h1>Welcome</h1>

<ul>

<li><a href="/auth/login">Login</a></li>

<li><a href="/auth/register">Register</a></li>

</ul>

`);

}

});

 

 

 

 

passport.serializeUser(function(user, done) {

console.log('serializeUser', user);

done(null, user.authId);

});

passport.deserializeUser(function(id, done) {

console.log('deserializeUser', id);

var sql = 'SELECT * FROM users WHERE authId=?';

conn.query(sql, [id], function(err, results){

if(err){

console.log(err);

done('There is no user.');

} else {

done(null, results[0]);

}

});

});

passport.use(new LocalStrategy(

function(username, password, done){

var uname = username;

var pwd = password;

var sql = 'SELECT * FROM users WHERE authId=?';

conn.query(sql, ['local:'+uname], function(err, results){

if(err){

return done('There is no user.');

}

var user = results[0];

console.log(user);

return hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash){

if(hash === user.password){

console.log('LocalStrategy', user);

done(null, user);

} else {

done(null, false);

}

});

});

}

));

passport.use(new FacebookStrategy({

clientID: '381822035542311',//개발자 페이지에서 APP ID

clientSecret: '5f8d7e59b8701fa64cf7343ebe8c0d8a',//개발자 페이지에서 App Secret 입력

callbackURL: "/facebook/callback",//다음 콜백 페이지

profileFields:['id', 'email', 'gender', 'link', 'locale',

'name', 'timezone', 'updated_time', 'verified', 'displayName']

},

function(accessToken, refreshToken, profile, done) {

console.log(profile);

var authId = 'facebook:'+profile.id;

var sql = 'SELECT * FROM users WHERE authId=?';

conn.query(sql, [authId], function(err, results){

if(results.length>0){//사용자가 존재하면

done(null, results[0]);

}else{//사용자가 없다면 사용자를 추가해야함

var newuser = {

'authId':authId,

'displayName':profile.displayName,

'email':profile.emails[0].value

};

var sql = 'INSERT INTO users SET ?';

conn.query(sql, newuser, function(err, results){

if(err){

console.log(err);

done('Error');

}else{//로그인 성공시

done(null, newuser);

}

});//쿼리문 완료

}//if 완료

});//쿼리문완료

}//function 완료

));

 

var auth = require('./routes/mysql/auth')(passport);//auth.js파일 불러옴 passport 함수의인자로 넘겨줌

app.use('/auth/', auth);//auth 접근하는 모든 접근을 auth라는 라우터로 위임함

 

app.listen(3003, function(){

console.log('Connected 3003 port!!!');

});

 

 

실행 화면

로긴 버튼 클릭

kch 1234 입력

로그인이 잘된다

 

 

 

https://opentutorials.org/course/2136

반응형