aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/config/passport.js
blob: e0be2d90d24a664326016afb5fd8684ab6cca6f7 (plain) (blame)
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);
            }
        });
    }));






}