1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
// dependencies
var mongoose = require('mongoose')
, LocalStrategy = require('passport-local').Strategy
, FacebookStrategy = require('passport-facebook').Strategy
, TwitterStrategy = require('passport-twitter').Strategy
, HashStrategy = require('passport-hash').Strategy
, User = mongoose.model('User')
, Access = mongoose.model('Access');
/**
* This is where the magic happends
*/
module.exports = function (passport, config) {
// serialize sessions
passport.serializeUser( function(user, done) {
done(null, user.id);
});
passport.deserializeUser( function(id, done) {
User.findOne({ _id: id }, function(err, user) {
done(err, user);
});
});
/**
* Local strategy
*/
passport.use('local', new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, function(email, password, done) {
// looks up the user in the database, and check if password matches
User.findOne({ email: email }, function(err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Unknown user' });
if (!user.authenticate(password)) return done(null, false, { message: 'Invalid password' });
return done(null, user);
});
}));
passport.use(new HashStrategy({ passReqToCallback: true }, function(req, hash, done) {
Access.findOne({ randomToken: hash }, function(err, access) {
if (err) return done(err);
if (!access) return done(null, false, { message: 'Unknown link' });
User.findOne({ _id: access.user }, function(err, user) {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Unknown user' });
return done(null, user);
});
});
}));
/**
* Facebook strategy
*/
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID
, clientSecret: config.facebook.clientSecret
, callbackURL: config.facebook.callbackURL
}, function(accessToken, refreshToken, profile, done) {
// looks up the user in the database. Will create the user if it does not exist
User.findOne({ 'facebook.id': profile.id }, function(err, user) {
if(err) return done(err);
if (!user) {
user = new User({
name: profile.displayName
, email: profile.emails[0].value
, username: profile.username
, provider: 'facebook'
, facebook: profile._json
});
user.save(function(err) {
if (err) console.log(err);
return done(err, user);
});
} else {
return done(err, user);
}
});
}));
/**
* Twitter strategy
*/
passport.use(new TwitterStrategy({
consumerKey: config.twitter.clientID
, consumerSecret: config.twitter.clientSecret
, callbackURL: config.twitter.callbackURL
}, function(token, tokenSecret, profile, done) {
// looks up the user in the database. Will create the user if it does not exist
User.findOne({ 'twitter.id': profile.id }, function(err, user) {
if (err) return done(err);
if (!user) {
user = new User({
name: profile.displayName
, username: profile.username
, provider: 'twitter'
, twitter: profile._json
});
user.save(function(err) {
if (err) console.log(err);
return done(err, user);
});
} else {
return done(err, user);
}
});
}));
}
|