프로그래밍/Node.js

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

가카리 2016. 12. 14. 22:33
반응형

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

 

이제 더욱 간단히 데이터베이스부터 express모듈 passport모듈까지 모두 쪼개보자

 

/config/mysql/express.js

 

module.exports = function(){

var express = require('express');

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

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

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

 

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'

})

}));

return app;

}

 

 

/config/mysql/passport.js

 

module.exports = function(app){

var conn = require('./db.js')();//같은 디렉토리이므로 ./ 함수니까 호출임

 

var passport = require('passport');

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

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

app.use(passport.initialize());

app.use(passport.session());

 

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 완료

));

 

return passport;

}

 

 

 

/config/mysql/db.js

 

module.exports = function(){

var mysql = require('mysql');

var conn = mysql.createConnection({

host : 'localhost',

user : 'root',

password : 'qwer1234',

database : 'o2',

port : 3307

});

conn.connect();

return conn;

};

 

 

/config/mysql/passport.js

 

module.exports = function(app){

var conn = require('./db.js')();//같은 디렉토리이므로 ./ 함수니까 호출임

 

var passport = require('passport');

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

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

app.use(passport.initialize());

app.use(passport.session());

 

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 완료

));

 

return passport;

}

 

 

/routes/mysql/auth.js

 

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

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

var hasher = bkfd2Password();

var conn = require('../../config/mysql/db')();//같은 디렉토리이므로 ./ 함수니까 호출임

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 app = require('./config/mysql/express')();//반드시 함수로 해야됨

var passport = require('./config/mysql/passport')(app);//반드시 패스포트는 위쪽에 써야됨

 

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>

`);

}

});

 

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!!!');

});

 

 

/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')

 

실행 화면

로긴 버튼 클릭

kch 1234 입력

로그인이 잘된다

등록도 잘된다.

 

다음과 같이 잘 된다.

 

출처 : https://opentutorials.org/course/2136

반응형