Skip to content
Snippets Groups Projects
Commit 89bb4e7f authored by Martin Lehoux's avatar Martin Lehoux
Browse files

Release 0.1: Authentication & Session

parent e47380d6
Branches
Tags
No related merge requests found
node_modules
yarn.lock
.vscode
config.json
\ No newline at end of file
# RoleGame # RoleGame
## Dependencies
### Used
* `express`: Fast, unopinionated, minimalist web framework
* `bcrypt`: A bcrypt library for NodeJS.
* `express-session`: Simple session middleware for Express
* `pug`: A clean, whitespace-sensitive template language for writing HTML
* `mongoose`: Mongoose MongoDB ODM
* `body-parser`: Node.js body parsing middleware
* `morgan`: HTTP request logger middleware for node.js
### To use
* `joi`: Object schema description language and validator for JavaScript objects.
## Release
### Next: v0.1.0
* [ ] Authentication and session
* [ ] Validate mongoose models
* [ ] Make mongoose unique index work
### Next: v0.2.0
* [ ] Message handler
{
"port": Number,
"secret": String,
"cryptRounds": Number
}
\ No newline at end of file
index.js 0 → 100644
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const User = require('./models/user');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const morgan = require('morgan');
const config = require('./config.json');
// Utils
const render = (req, res, view, options) => res.render(view, {
...options,
user: req.session.user,
nextUrl: req.url,
});
// Configuration
const app = express();
app.set('view engine', 'pug');
app.use(morgan('tiny'));
app.use(session({
secret: config.secret,
resave: false,
saveUninitialized: false
}));
// Middlewares
app.use(bodyParser.urlencoded({
extended: false,
}));
app.use((req, res, next) => {
if (req.session.user || ['/', '/signup', '/login'].includes(req.url)) {
next();
} else {
return res.redirect('/signup');
}
});
app.get('/', (req, res) => {
return render(req, res, 'home');
});
app.get('/signup', (req, res) => {
return render(req, res, 'signup');
});
app.post('/signup', (req, res) => {
const passwordHash = bcrypt.hashSync(req.body.password, config.cryptRounds);
User.create(req.body, (err, user) => {
err ? console.error(err) : null;
user.passwordHash = passwordHash;
user.save();
req.session.user = user;
return res.redirect('/');
});
});
app.post('/login', (req, res) => {
User.findOne({ username: req.body.username }, (err, user) => {
err ? console.error(err) : null;
if (bcrypt.compareSync(req.body.password, user.passwordHash)) {
req.session.user = user;
return res.redirect(req.query.nextUrl || '/');
} else {
console.error("Bad authentication");
return res.redirect('/signup');
}
});
});
app.post('/logout', (req, res) => {
req.session.destroy();
return res.redirect('/');
})
mongoose.connect('mongodb://localhost/rolegame', err => {
if (err) {
console.error('ERROR Unable to connect to Mongo database')
} else {
console.log('Server connected to Mongo database');
}
app.listen(config.port, () => {
console.log(`Server listening on http://localhost:${config.port}`);
});
});
const mongoose = require('mongoose');
const Character = new mongoose.Schema({
name: String,
level: Number,
});
module.exports = mongoose.model('Character', Character);
\ No newline at end of file
const mongoose = require('mongoose');
const User = new mongoose.Schema({
firstName: {
type: String,
required: true,
},
lastName: {
type: String,
},
username: {
unique: true,
type: String,
lowercase: true
},
email: {
type: String,
required: true,
},
passwordHash: {
type: String,
},
});
module.exports = mongoose.model('User', User);
\ No newline at end of file
const mongoose = require('mongoose');
const Weapon = new mongoose.Schema({
name: String,
required_level: Number
});
module.exports = mongoose.model('Weapon', Weapon);
\ No newline at end of file
{
"scripts": {
"dev": "nodemon index.js"
},
"dependencies": {
"bcrypt": "^3.0.4",
"body-parser": "^1.18.3",
"eslint": "^5.13.0",
"express": "^4.16.4",
"express-session": "^1.15.6",
"mongoose": "^5.4.11",
"morgan": "^1.9.1",
"nodemon": "^1.18.10",
"pug": "^2.0.3"
}
}
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
link(rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=" crossorigin="anonymous")
title RoleGame
body
block navbar
if !user
form.ui.form(action="/login", method="post")
.ui.pointing.menu
.right.menu
.item
.ui.input.transparent
input#username(type="text" name="username" placeholder="username")
.item
.ui.transparent.input
input#password(type="password" name="password" placeholder="password")
.item
.ui.transparent.input
input.ui.button(type="submit" value="Se connecter")
else
form.ui.form(action="/logout", method="post")
.ui.pointing.menu
.right.menu
.item #{user.firstName} #{user.lastName}
.item
button.ui.icon.button.basic(type="submit")
i.power.off.icon
.ui.container
block main
block script
script(src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous")
script(src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=" crossorigin="anonymous")
\ No newline at end of file
extends base.pug
block main
h1.ui.header Bienvenue sur RoleGame
extends base.pug
block main
form.ui.form(action="/signup" method="post")
.two.fields
.field
label(for="firstName") Prénom
input#firstName(type="text", name="firstName")
.field
label(for="lastName") Nom de famille
input#lastName(type="text", name="lastName")
.field
label(for="email") Email
input#email(type="email", name="email")
.field
label(for="username") Nom d'utilisateur
input#username(type="text", name="username")
.field
label(for="password") Mot de passe
input#password(type="password", name="password")
.field
input.ui.button(type="submit", value="S'inscrire")
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment