Passport를 이용해서 로그인 처리를 하도록 할께요
yarn add passport passport-local
passport 플러그인 작성
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const jwt = require('./jwt');
const memberModel = require('../api/_model/memberModel');
module.exports = (app) => {
app.use(passport.initialize());
passport.use(new LocalStrategy(
{
usernameField : 'mb_id',
passwordField : 'mb_password'
},
async (mb_id, mb_password, done) => {
try {
mb_password = jwt.generatePassword(mb_password);
const member = await memberModel.getMemberBy({mb_id, mb_password});
return done(null, member);
} catch(e) {
console.log(e.message);
return done(null, null, '아이디 또는 비밀번호가 올바르지 않습니다.');
}
}
))
}
server.js에서 passport 사용
// 파서 아래쪽에 작성
// Passport
const passport = require('./plugins/passport');
passport(app);
memberModel에 getMemberBy 함수와 로그인 일시 및 IP를 갱신하는 함수 작성
// 생략...
function clearMemberField(member) {
delete member.mb_password;
member.mb_create_at = moment(member.mb_create_at).format('LT');
member.mb_update_at = moment(member.mb_update_at).format('LT');
if (member.mb_login_at) {
member.mb_login_at = moment(member.mb_login_at).format('LT');
}
if (member.mb_leave_at) {
member.mb_leave_at = moment(member.mb_leave_at).format('LT');
}
if (member.mb_birth) {
member.mb_birth = moment(member.mb_birth).format('L');
}
return member;
}
const memberModel = {
// 생략...
async getMemberBy(form, cols = []) {
const sql = sqlHelper.SelectSimple(TABLE.MEMBER, form, cols);
const [[row]] = await db.execute(sql.query, sql.values);
if (!row) {
throw new Error('존재하지 않는 회원입니다.');
}
return clearMemberField(row);
},
loginMember(req) {
const data = {
mb_login_at: moment().format('LT'),
mb_login_ip: getIp(req),
};
const { mb_id } = req.body;
const sql = sqlHelper.Update(TABLE.MEMBER, data, {mb_id});
db.execute(sql.query, sql.values);
return data;
},
}
sqlHelper에 Update 함수 추가
Update(table, data, where) {
let query = `UPDATE ${table} SET {1} WHERE {2}`;
const keys = Object.keys(data);
const sets = [];
const values = [];
for (const key of keys) {
sets.push(`${key}=?`);
values.push(data[key]);
}
query = query.replace('{1}', sets.join(', '));
const keys2 = Object.keys(where);
const wheres = [];
for (const key of keys2) {
wheres.push(`${key}=?`);
values.push(where[key]);
}
query = query.replace('{2}', wheres.join(' AND '));
return { query, values };
}
라우터에서 Passport 를 이용해 회원정보와 토큰 발급하기
// 생략...
const passport = require('passport');
const jwt = require('../plugins/jwt');
// 로그인
router.post('/loginLocal', async (req, res) => {
passport.authenticate('local', function (err, member, info) {
if (info) {
res.json({ err: info })
} else {
req.login(member, { session: false }, (err) => {
if (err) {
console.log('loginLocal', err);
res.json({ err })
} else {
const token = jwt.getToken(member);
const data = memberModel.loginMember(req);
member.mb_login_at = data.mb_login_at;
member.mb_login_ip = data.mb_login_ip;
res.json({token, member});
}
})
}
})(req, res);
});
회원로그인 후 댓글을 작성하실 수 있습니다. 로그인