# PassportJS
: node.js express에서 사용하는 인증관련 미들웨어
- passport.js에서 다양한 인증 방법을 stragies로 제공
Passport.js
Simple, unobtrusive authentication for Node.js
www.passportjs.org
# passport-local
- 구글, 네이버 등을 거치지 않고 기본 id, password를 이용해 인증하기
npm install --save passport passport-local
# 미들웨어
: 함수가 실행되면 해당 함수는 리턴값으로 콜백 함수를 리턴한다
사용자가 로그인에 성공하면 done(null, user); 실행
done(null, user); 이 실행되면 passport.serializeUser((user, done)=>{}) 함수의 콜백함수 실행
세션에 등록 다음 방문 시에도 username이 세션에 저장되어 있음
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser((user, done)=> {
done(null, user.username); // 식별자
});
passport.deserializeUser((id, done)=> {
for (var i = 0; i < users.length; i++) {
var user = users[i];
if(user.username === id){
return done(null, user);
}
}
});
passport.use(new LocalStrategy((username, password, done) => {
var uname = username;
var pw = password;
for (var i = 0; i < users.length; i++) {
var user = users[i];
if (uname === user.username) {
return hasher({ password: pw, salt: user.salt }, (err, pass, salt, hash) => {
if (hash === user.password) {
done(null, user);
} else {
done(null, false);
}
});
}
}
done(null,false);
})
);
app.post('/auth/login', passport.authenticate(
'local',
{
successRedirect: '/welcome',
failureRedirect: '/auth/login',
failureFlash: false
}));
app.get('/auth/login', (req, res) => {
var output = `
<h1>Login</h1>
<form action="/auth/login" method = "post">
<p>
<input type ="text" name = "username" placeholder = "username"></input>
</p>
<p>
<input type ="password" name = "password" placeholder = "password"></input>
</p>
<p>
<input type = "submit"></input>
</p>
</form>
<a href = "/auth/register">register</a>`;
res.send(output);
});
app.post('/auth/register', (req, res) => {
hasher({ password: req.body.password }, (err, pass, salt, hash) => {
var user = {
username: req.body.username,
password: hash,
salt: salt,
displayName: req.body.displayName
};
users.push(user);
req.login(user, ()=>{
req.session.save(() => {
res.redirect('/welcome');
});
});
console.log(users);
});
});
app.get('/auth/register', (req, res) => {
var output = `
<h1>Register</h1>
<form action="/auth/register" method = "post">
<p>
<input type ="text" name = "username" placeholder = "username"></input>
</p>
<p>
<input type ="password" name = "password" placeholder = "password"></input>
</p>
<p>
<input type ="displayName" name = "displayName" placeholder = "username"></input>
</p>
<p>
<input type = "submit"></input>
</p>
</form>`;
res.send(output);
})
app.get('/auth/logout', (req, res) => {
req.logout(()=>{
req.session.save(() => {
res.redirect('/welcome');
});
});
});
app.get('/welcome', (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>`);
}
});
'BACKEND > Node.js' 카테고리의 다른 글
[ 생활코딩 - Node.js 활용하기 ] 06. pug - extends (0) | 2022.12.05 |
---|---|
[ 생활코딩 - Node.js 활용하기 ] 05. mySQL 버전 로그인 인증 ( local 방식 / facebook 방식) (0) | 2022.12.05 |
[ 생활코딩 - Node.js 활용하기] 03. Security Password (1) | 2022.12.01 |
[ 생활코딩 - Node.js 활용하기] 2. Session (0) | 2022.11.28 |
[ 생활코딩 - Node.js 활용하기] 1. cookie (0) | 2022.11.27 |