users 테이블 생성
- 테이블 생성
mysql> 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),
-> PRIMARY KEY(id),
-> UNIQUE (authid));
- 결과
mysql> DESC users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| authId | varchar(50) | NO | UNI | NULL | |
| username | varchar(30) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
| salt | varchar(255) | YES | | NULL | |
| displayName | varchar(50) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)
local - 회원가입
app.post('/auth/register', (req, res) => {
hasher({ password: req.body.password }, (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, (err, results) => {
if (err) {
console.log(err);
res.status(500);
} else {
req.logIn(user, (err)=>{
req.session.save(()=>{
res.redirect('/welcome');
});
});
}
});
});
});
local - 로그인
passport.serializeUser((user, done) => {
done(null, user.authId); // 식별자
});
passport.deserializeUser((id, done) => {
var sql = 'select * from users where authId = ?';
conn.query(sql, [id], (err, results)=>{
console.log(sql, err, results);
if(err){
console.log(err);
done('There is no user.');
}else{
done(null, results[0]);
}
});
});
passport.use(new LocalStrategy((username, password, done) => {
var uname = username;
var pw = password;
var sql = 'select * from users where authId =?';
conn.query(sql, ['local:' + uname], (err, results) => {
if (err) {
console.log(err);
return done('There is no user.');
}
var user = results[0];
return hasher({ password: pw, salt: user.salt }, (err, pass, salt, hash) => {
if (hash === user.password) {
done(null, user);
} else {
done(null, false);
}
});
})
})
);
app.post('/auth/login', passport.authenticate(
'local',
{
successRedirect: '/welcome',
failureRedirect: '/auth/login',
failureFlash: false
}));
facebook - 로그인
app.get('/auth/facebook', passport.authenticate(
'facebook',
{scope : 'email'}
));
app.get('/auth/facebook/callback',
passport.authenticate(
'facebook',
{
successRedirect: '/welcome',
failureRedirect: '/auth/login',
failureFlash: false
}));
passport.use(new FacebookStrategy({
clientID: id,
clientSecret: secret,
callbackURL: "/auth/facebook/callback",
profileFields : ['id','emails','gender','link','locale','name',
'timezone','updated_time','verified','displayName']
},
(accessToken, refreshToken, profile, done) => {
console.log(profile);
var authId = 'facebook:'+profile.id;
var sql = 'select * from users where authId=?';
conn.query(sql,[authId],(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, (err, results)=>{
if(err){
console.log(err);
done('Error!');
}else{
done(null,newuser);
}
})
}
})
}
));
'BACKEND > Node.js' 카테고리의 다른 글
[ mongoDB + express + ejs ] 간단한 get, post, delete 구현하기 (0) | 2023.09.27 |
---|---|
[ 생활코딩 - Node.js 활용하기 ] 06. pug - extends (0) | 2022.12.05 |
[ 생활코딩 - Node.js 활용하기 ] 04. 인증을 쉽게 도와주는 PassportJS모듈 (0) | 2022.12.02 |
[ 생활코딩 - Node.js 활용하기] 03. Security Password (1) | 2022.12.01 |
[ 생활코딩 - Node.js 활용하기] 2. Session (0) | 2022.11.28 |