authentication MySQL 1
이전까지는 Users 배열을 이용했다면 이제는 Users 테이블을 데이터베이스에 직접 만들어서 사용하려 한다.
먼저 테이블은 아래의 SQL 구문을 이용해서 만든다.
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT ,
authId VARCHAR(50) NOT NULL ,
username VARCHAR(30),
password VARCHAR(255),
salt VARCHAR(255),
displayName VARCHAR(50),
email VARCHAR(50) NOT NULL ,
PRIMARY KEY (id),
UNIQUE (authId)
) ENGINE = InnoDB;
authentication MySQL 2 - Session store
지난번 app_session_mysql.js 에서 했던 실습과 동일하다. 세션을 MySQL에 저장하기 위한 코드를 추가한다.
var MySQLStore = require('express-mysql-session')(session);
var options = {
host: 'localhost',
port: 3306,
user: 'root',
password: '',
database: 'o2'
};
app.use(session({
secret: 'dkagh1886', //random한 값을 넣어주기.
resave: false, // 접속할 때마다 session id를 새로 발급하지 말아라.
saveUninitialized: true, // session을 사용하기 전까지 session id를 발급하지 말아라
store: new MySQLStore(options)
}));
authentication MySQL 3 - register
register 페이지에서 등록할 때 db에 접근하기 위해서 먼저 아래 코드를 추가한다.
var mysql = require('mysql');
var conn = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'qlrqhod8818!',
database : 'o2'
});
conn.connect();
그리고 '/auth/register'의 post 라우터에 기존의 배열에 push 방법 대신 db에 등록하는 쿼리를 날린다.
var sql = 'insert into users set ?';
conn.query(sql, user, function(err, results){
if (err){
console.log(err);
res.status(500);
}else {
res.redirect('/welcome');
}
});
그럼 register 버튼을 누르고 select * from users\G 명령어를 입력했을 때 잘 등록된 것을 확인할 수 있다. \G를 붙이면 예쁜 형식으로 출력된다.
authentication MySQL 4 - login
이제 login 부분을 수정하자. 로그인 버튼을 누르면 '/auth/login' post 라우터로 이동하고 passportjs에 의해서 local Strategy로 넘어간다. 그래서 LocalStrategy의 코드를 쿼리로 수정해주고, deserializeUser의 코드도 수정해준다.
passport.deserializeUser(function(id, cb) {
console.log('deserializeUser', id);
process.nextTick(function(){
var sql = 'select * from users where authId=?';
conn.query(sql, [id], function(err, results){
if (err){
console.log(err);
cb('There is no user');
} else{
cb(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:'+username], 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); //login 성공 -> serializeUser의 콜백함수가 실행됨.
} else{
done(null, false); //login 실패
}
});
})
}
))
그리고 register 라우터에서 register버튼을 누르면 바로 로그인 화면으로 넘어가는 기능을 추가한다. 코드는 이전 것과 동일하다.
authentication MySQL 5 - federation
facebook login을 db로 구현하기 위해서 facebookStrategy 코드를 수정한다.
passport.use(new FacebookStrategy({
clientID: '507313687403971',
clientSecret: '725ebcf8dc9ebac8ff3897fe27b102f4',
callbackURL: "http://localhost:3003/auth/facebook/callback",
profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name',
'timezone', 'updated_time', 'verified', 'displayName']
},
function(accessToken, refreshToken, profile, cb) {
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){
cb(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);
cb('Error');
} else{
cb(null, newUser);
}
})
}
})
}
));
그럼 페이스북으로 로그인했을 때 db에 사용자 정보가 추가된 것을 확인할 수 있다!
'스터디📖 > Node.js' 카테고리의 다른 글
[nodejs] Node.Js 활용하기 - 섹션 9. 정리정돈의 기술 2 - 자신의 모듈 만들기 (0) | 2022.02.15 |
---|---|
[nodejs] Node.Js 활용하기 - 섹션8. 정리정돈의 기술 1 - Jade Extends 살펴보기 (0) | 2022.02.15 |
[nodejs] Node.Js 활용하기 - 섹션 5. 타사인증 (Federation authentication) (0) | 2022.02.14 |
[nodejs] Node.Js 활용하기 - 섹션 4. 인증을 쉽게 도와주는 PassportJS 모듈 (0) | 2022.02.14 |
[nodejs] Node.Js 활용하기 - 섹션 3. 비밀번호 보안 (Security Password) (0) | 2022.02.12 |