Skip to content

Instantly share code, notes, and snippets.

@x-yuri
Created February 7, 2021 23:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save x-yuri/6934d61249c4bf5f1d9d2faa7e959570 to your computer and use it in GitHub Desktop.
Save x-yuri/6934d61249c4bf5f1d9d2faa7e959570 to your computer and use it in GitHub Desktop.
#passport #sessions #nodejs #express

passport: local strategy with sessions

index.js:

const express = require('express');
const passport = require('passport');
const passportLocal = require('passport-local');
const bodyParser = require('body-parser');
const expressSession = require('express-session');

passport.use(new passportLocal.Strategy(
  function(username, password, done) {
    if (username != 'admin' && password != '123') {
      return done(null, false);
    }
    return done(null, {name: username});
  }
));

passport.serializeUser(function(user, done) {
  done(null, user.name);
});

passport.deserializeUser(function(username, done) {
  return done(null, {name: username});
});

const app = express();
const port = 3000;
app.set('view engine', 'ejs');

app.use(bodyParser.urlencoded({
  extended: false,
}));
app.use(expressSession({
    secret: 'secret',
    resave: false,
    saveUninitialized: false,
}));
app.use(passport.initialize());
app.use(passport.session());

app.get('/', (req, res) => {
  if ( ! req.user)
    return res.redirect('/login');
  res.send(`Hello, ${req.user.name}!`);
});

app.get('/login', (req, res) => {
  res.render('login');
});

app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login' })
);

app.listen(port, () => {
  console.log(`Listening at http://localhost:${port}`);
});

views/login.ejs:

<!doctype html>
<html>
<head>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/milligram/1.4.1/milligram.css">
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="column">
        <form action="/login" method="post">
          <label for="username-field">Username</label>
          <input type="text" name="username" id="username-field">

          <label for="password-field">Username</label>
          <input type="password" name="password" id="password-field">

          <input class="button-primary" type="submit" value="Log in">
        </form>
      </div>
    </div>
  </div>
</body>
</html>

package.json:

{
  "dependencies": {
    "body-parser": "^1.19.0",
    "ejs": "^3.1.6",
    "express": "^4.17.1",
    "express-session": "^1.17.1",
    "passport": "^0.4.1",
    "passport-local": "^1.0.0"
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment