036 - Passport로 로컬로그인 하기
남기용 205

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);
});


회원로그인 후 댓글을 작성하실 수 있습니다. 로그인
© 2024 ezcode all right reserved.