DEVELOP
article thumbnail

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

 

profile

DEVELOP

@JUNGY00N