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"
}
}