Skip to content

Commit c3b74b0

Browse files
committed
init
0 parents  commit c3b74b0

17 files changed

+2149
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
config.js
2+
node_modules

access.log

+592
Large diffs are not rendered by default.

config/db.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const mongoose = require('mongoose');
2+
const {config} = require('./config')
3+
const URL = config.urlDB;
4+
mongoose.connect(URL);
5+
6+
7+
//event handler
8+
mongoose.connection.once('connected', () => {
9+
console.log('Connected DB to: ', URL);
10+
})
11+
12+
mongoose.connection.on('error', (err) => {
13+
console.log('DB error connection:', err);
14+
15+
})
16+
17+
mongoose.connection.on('Disconnected', () => {
18+
console.log('Dissconnected to DB');
19+
20+
})
21+

config/passport.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
const passport = require('passport');
3+
const LocalStrategy = require('passport-local').Strategy;
4+
const { User } = require('../models/user');
5+
6+
7+
8+
passport.serializeUser((user, done) => {
9+
console.log('Serialize passport: ')
10+
if(typeof user.name != 'string') return done(null, user.displayName)
11+
done(null, user.name)
12+
})
13+
14+
passport.deserializeUser((name, done) => {
15+
console.log('Deserialize', name);
16+
User.findOne({ name: name})
17+
.then( user => {
18+
if(!user) return done(null, false)
19+
return done(null, user)
20+
})
21+
.catch( err => done(err))
22+
})
23+
24+
passport.use(new LocalStrategy({
25+
usernameField: 'email',
26+
},
27+
(username, password, done) => {
28+
console.log('Passport config');
29+
30+
User.findOne({ email: username })
31+
.then(user => {
32+
if (!user) {
33+
console.log('Passport error: Incorrect username');
34+
return done(null, false, { message: 'Incorrect username' });
35+
}
36+
//console.log('Find User: ', user);
37+
38+
if (!user.validPassword(password, user.salt, user.hash)) {
39+
console.log('Passport error: Incorrect password');
40+
return done(null, false, { message: 'Incorrect password' })}
41+
42+
return done(null, user)
43+
})
44+
.catch(err => {
45+
console.log('Loi config passport: ', err);
46+
47+
done(err)
48+
})
49+
}))

config/passportfb.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
const passport = require('passport')
3+
const passportfb = require('passport-facebook').Strategy
4+
const { User } = require('../models/user');
5+
6+
passport.serializeUser((user, done) => {
7+
console.log('Serialize passport Fb: ', user)
8+
done(null, user.id)
9+
})
10+
11+
passport.deserializeUser((fbid, done) => {
12+
User.findOne({fbid}, (err, user) => {
13+
if(err) return console.log(err)
14+
done(null, user);
15+
})
16+
})
17+
18+
passport.use(new passportfb({
19+
clientID: '394814394294763',
20+
clientSecret: 'bdd916fac40827aaaae4cf18ebb30551',
21+
callbackURL: 'http://localhost:3000/auth/fb/cb',
22+
profileFields: ['id', 'displayName', 'photos', 'email']
23+
}, (accessToken, refeshToken, profile, done) => {
24+
//console.log(profile);
25+
const {id, name, email} = profile._json;
26+
User.findOne({fbid: id}, (err, user) =>{
27+
if(err) return done(err);
28+
if(user) return done(null, user);
29+
const newUser = new User({
30+
fbid: id,
31+
name,
32+
email
33+
})
34+
35+
newUser.save((err, user) => {
36+
if(err) return done(err);
37+
done(null, newUser)
38+
})
39+
40+
})
41+
42+
43+
44+
}))
45+

controllers/auth.js

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
var { User } = require('../models/user')
2+
const passport = require('passport');
3+
4+
const ctrlRegister = (req, res, next) => {
5+
res.render('register');
6+
}
7+
8+
const ctrlAddUser = (req, res, next) => {
9+
const { name, email, password } = req.body;
10+
var user = new User({
11+
name,
12+
email
13+
});
14+
user.setPassword(password);
15+
// console.log('Set user', user);
16+
// res.send('User set')
17+
user.save()
18+
.then(user => {
19+
console.log('Add user successfull: ', user);
20+
res.send('User set');
21+
})
22+
.catch(err => {
23+
console.log('Add user error: ', err);
24+
res.send('Add user error: ', err)
25+
})
26+
}
27+
28+
const ctrlLogin = (req, res, next) => {
29+
console.log('ctrlLogin');
30+
31+
passport.authenticate('local', (err, user, message) => {
32+
if (err) {
33+
console.log('loi chung thuc: ', err);
34+
res.status(404);
35+
res.json({
36+
message: err
37+
})
38+
return
39+
}
40+
if (message) {
41+
console.log('Message: ', message);
42+
res.status(404);
43+
res.json({
44+
message: err
45+
})
46+
return
47+
}
48+
res.redirect('/');
49+
})(req, res);
50+
}
51+
52+
function isloggedIn( req, res, next){
53+
if(req.isAuthenticated()){
54+
return next()
55+
}
56+
res.redirect('/login')
57+
}
58+
59+
module.exports = { ctrlRegister, ctrlAddUser, ctrlLogin, isloggedIn }

index.js

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
const express = require('express');
2+
const app = express();
3+
const mongoose = require('mongoose');
4+
require('./config/db')
5+
const bParser = require('body-parser');
6+
const cookieParser = require('cookie-parser');
7+
const session = require('express-session');
8+
const mongoDBStore = require('connect-mongo')(session);
9+
const logger = require('morgan');
10+
const path = require('path');
11+
const fs = require('fs');
12+
var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a', encoding: null });
13+
var passport = require('passport');
14+
const {config} = require('./config/config')
15+
//express setting
16+
app.set('views', './views');
17+
app.set('view engine', 'ejs')
18+
//middleware
19+
app.use(logger('dev', { stream: accessLogStream }));
20+
app.use(bParser.json())
21+
app.use(bParser.urlencoded({ extended: true })) // req.body object contains string, array or any type
22+
app.use(express.static(__dirname + 'public'))
23+
//app.use(cookieParser('thisIsSecret'));
24+
app.use(session({
25+
name: 'connect.sid.duy',
26+
secret: config.secret,
27+
saveUninitialized: false, // don't create session until something store // default true: luu session du chua tao bien session
28+
resave: false, // don't save session if unmodifiled
29+
store: new mongoDBStore({
30+
mongooseConnection: mongoose.connection,
31+
touchAfter: 60 * 60 * 24
32+
}),
33+
cookie: {
34+
maxAge: 15 * 60 * 1000
35+
}
36+
}))
37+
//passport
38+
require('./config/passport');
39+
require('./config/passportfb')
40+
app.use(passport.initialize());
41+
app.use(passport.session());
42+
43+
//routes
44+
const {ctrlRegister, ctrlAddUser, ctrlLogin, isloggedIn} = require('./controllers/auth')
45+
app.get('/', isloggedIn, (req, res, next) => {
46+
console.log(req.user);
47+
48+
if (!req.session.count) {
49+
req.session.count = 1;
50+
return res.render('home', {
51+
varSession: req.session.count,
52+
user: req.user
53+
});
54+
} else {
55+
req.session.count++;
56+
}
57+
res.render('home', {
58+
varSession: req.session.count,
59+
user: req.user
60+
});
61+
// res.render('home', {varSession: 1})
62+
63+
})
64+
//
65+
66+
app
67+
.get('/error', (req, res, next) => res.render('error'))
68+
.get('/register', ctrlRegister)
69+
.post('/register', ctrlAddUser)
70+
.get('/login', (req, res, next) => res.render('login'))
71+
.post('/login', passport.authenticate('local', {
72+
successRedirect: '/',
73+
failureRedirect: '/error'
74+
}))
75+
76+
app
77+
.get('/auth/fb', passport.authenticate('facebook', {scope: ['email']}))
78+
.get('/auth/fb/cb', passport.authenticate('facebook', {
79+
successRedirect: '/',
80+
failureRedirect: '/error'
81+
}))
82+
// .get('/auth/fb/cb', (req, res) => {
83+
// passport.authenticate('facebook', (err, user, message) => {
84+
// if(err) return console.log(err)
85+
// if(user) res.redirect('/')
86+
// })(req, res)
87+
// })
88+
89+
app.get('/logout', (req, res, next) => {
90+
req.logout();
91+
req.session.destroy();
92+
res.redirect('/login')
93+
})
94+
95+
app.use((err, req, res, next) => {
96+
res.status(404);
97+
res.json({
98+
message: err
99+
})
100+
})
101+
app.listen(3000, (err) => {
102+
if (err) console.log('Server error: ', err);
103+
console.log('Server started.');
104+
})

models/user.js

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const mongoose = require('mongoose');
2+
const crypto = require('crypto');
3+
4+
const userSchema = new mongoose.Schema({
5+
fbid: {
6+
type: String
7+
},
8+
email: {
9+
type: String,
10+
trim: true,
11+
//required: true,
12+
unique: true
13+
},
14+
name: {
15+
type: String,
16+
required: true,
17+
trim: true
18+
},
19+
salt: {
20+
type: String,
21+
//required: true
22+
},
23+
hash: {
24+
type: String,
25+
//required: true
26+
}
27+
})
28+
29+
userSchema.methods.setPassword = function(password) {
30+
31+
this.salt = crypto.randomBytes(16).toString('hex');
32+
this.hash = crypto.pbkdf2Sync(password, new Buffer(salt), 1000, 64, 'sha1').toString('hex');
33+
34+
}
35+
36+
userSchema.methods.validPassword = function(password) {
37+
// console.log('Password: ', password);
38+
// console.log('Salt validPassword', userSalt);
39+
const hash = crypto.pbkdf2Sync(password, new Buffer(this.salt), 1000, 64, 'sha1').toString('hex');
40+
// console.log('Hash value: ', hash);
41+
42+
43+
return hash == this.hash;
44+
}
45+
46+
const User = mongoose.model('User', userSchema);
47+
48+
module.exports = { User };

package.json

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "auth-session",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"license": "MIT",
6+
"dependencies": {
7+
"body-parser": "^1.18.2",
8+
"connect-mongo": "^2.0.1",
9+
"cookie-parser": "^1.4.3",
10+
"crypto": "^1.0.1",
11+
"ejs": "^2.5.7",
12+
"express": "^4.16.3",
13+
"express-session": "^1.15.6",
14+
"mongoose": "^5.0.10",
15+
"morgan": "^1.9.0",
16+
"passport": "^0.4.0",
17+
"passport-facebook": "^2.1.1",
18+
"passport-local": "^1.0.0"
19+
}
20+
}

test.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const mongoose = require('mongoose');
2+
3+
const userSchema = new mongoose.Schema({
4+
email: {
5+
type: String,
6+
trim: true,
7+
required: true,
8+
unique: true
9+
},
10+
name: {
11+
type: String,
12+
required: true,
13+
trim: true
14+
}
15+
16+
})
17+
18+
userSchema.methods.setEmail = function(email) {
19+
console.log(this);
20+
this.email = email;
21+
}
22+
23+
var User = mongoose.model('User', userSchema);
24+
var user = new User({ name: 'Teo' });
25+
user.setEmail('teo96@gmail.com');
26+
27+
console.log('Print user: ', user);
28+
29+

test1.js

Whitespace-only changes.

0 commit comments

Comments
 (0)