2015-10-09 38 views
1

https://github.com/jaredhanson/passport-remember-mePassport.js記得我的功能

passport.use(new RememberMeStrategy(
    function(token, done) { 
    Token.consume(token, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     return done(null, user); 
    }); 
    }, 
    function(user, done) { 
    var token = utils.generateToken(64); 
    Token.save(token, { userId: user.id }, function(err) { 
     if (err) { return done(err); } 
     return done(null, token); 
    }); 
    } 
)); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    function(req, res, next) { 
    // issue a remember me cookie if the option was checked 
    if (!req.body.remember_me) { return next(); } 

    var token = utils.generateToken(64); 
    Token.save(token, { userId: req.user.id }, function(err) { 
     if (err) { return done(err); } 
     res.cookie('remember_me', token, { path: '/', httpOnly: true, maxAge: 604800000 }); // 7 days 
     return next(); 
    }); 
    }, 
    function(req, res) { 
    res.redirect('/'); 
    }); 

我試圖實現記得我的功能(以上)到我現有的應用程序,但我不能做到這一點。當我將RememberMeStrategy添加到我的login.js中時,它會拋出

ReferenceError: RememberMeStrategy is not defined

錯誤。這裏缺少什麼?

index.js

var rendering = require('../util/rendering'); 

var express = require('express'); 
var router = express.Router(); 

exports.home = function(req, res) { 
    res.render('index/index'); 
}; 


exports.userHome = function(req, res) { 
    res.render('index/user-home'); 
}; 

login.js

var crypto = require('crypto'), 
    passport = require('passport'), 
    passportRememberMe = require('passport-remember-me'), 
    passportLocal = require('passport-local'), 
    data = require('../models/auth')(); 

exports.registerPage = function (req, res) { 
    res.render('login/register', {username: req.flash('username')}); 
}; 


exports.registerPost = function (req, res) { 
    var vpw = req.body.vpw; 
    var pwu = req.body.pw; 
    var un = req.body.un; 

    req.flash('username', un); 

    if (vpw !== pwu) { 
     req.flash('error', 'Your passwords did not match.'); 
     res.redirect('/register'); 
     return; 
    } 

    req.checkBody('un', 'Please enter a valid email.').notEmpty().isEmail(); 
    var errors = req.validationErrors(); 
    if (errors) { 
     var msg = errors[0].msg; 
     req.flash('error', msg); 
     res.redirect('/register'); 
     return; 
    } 

    var new_salt = Math.round((new Date().valueOf() * Math.random())) + ''; 
    var pw = crypto.createHmac('sha1', new_salt).update(pwu).digest('hex'); 
    var created = new Date().toISOString().slice(0, 19).replace('T', ' '); 

    new data.ApiUser({email: un, password: pw, salt: new_salt, created: created}).save().then(function (model) { 
     passport.authenticate('local')(req, res, function() { 
      res.redirect('/home'); 
     }) 
    }, function (err) { 
     req.flash('error', 'Unable to create account.'); 
     res.redirect('/register'); 
    }); 
}; 


exports.loginPage = function (req, res) { 
    res.render('login/index', {username: req.flash('username')}); 
}; 


exports.checkLogin = function (req, res, next) { 
    passport.authenticate('local', function (err, user, info) { 
     if (err || !user) { 
      req.flash('username', req.body.un); 
      req.flash('error', info.message); 
      return res.redirect('/login'); 
     } 
     req.logIn(user, function (err) { 
      if (err) { 
       req.flash('error', info.message); 
       return res.redirect('/login'); 
      } 

      req.flash('success', 'Welcome!'); 
      return res.redirect('/home'); 
     }); 
    })(req, res, next); 
}; 

exports.logout = function (req, res) { 
    req.logout(); 
    req.flash('info', 'You are now logged out.'); 
    res.redirect('/login'); 
}; 

routes.js

var rendering = require('./util/rendering'), 
    indexController = require('./controllers/index'), 
    loginController = require('./controllers/login'); 

module.exports = function (app, passport) { 

    // Home 
    app.get('/', indexController.home); 
    app.get('/home', ensureAuthenticated, indexController.userHome); 


    // Auth 
    app.get('/register', loginController.registerPage); 
    app.post('/register', loginController.registerPost); 
    app.get('/login', loginController.loginPage); 
    app.post('/login', loginController.checkLogin); 
    app.get('/logout', loginController.logout); 

    // 'rendering' can be used to format api calls (if you have an api) 
    // into either html or json depending on the 'Accept' request header 
    app.get('/apitest', function(req, res) { 
     rendering.render(req, res, { 
      'data': { 
       'test': { 
        'testsub': { 
         'str': 'testsub hello world' 
        }, 
        'testsub2': 42 
       }, 
       'test2': 'hello world' 
      } 
     }); 
    }) 


    // Auth Middleware 
    function ensureAuthenticated(req, res, next) { 
     if (req.isAuthenticated()) { return next(); } 
     res.redirect('/login'); 
    } 
} 

server.js

var dbConfig; 
try { 
    // Look for dev conf for local development 
    dbConfig = require('./config/db.dev.conf.js'); 
} catch(e) { 
    try { 
     // production conf? 
     dbConfig = require('./config/db.conf.js'); 
    } catch(e) { 
     console.log('Startup failed. No db config file found.'); 
     return false; 
    } 
} 


var knex = require('knex')({ 
     client: 'mysql', 
     connection: dbConfig 
    }), 
    express = require('express'), 
    bodyParser = require('body-parser'), 
    cookieParser = require('cookie-parser'), 
    cookieSession = require('cookie-session'), 
    serveStatic = require('serve-static'), 
    expressValidator = require('express-validator'), 
    flash = require('connect-flash'), 
    swig = require('swig'), 
    passport = require('passport'), 
    passportRememberMe = require('passport-remember-me'), 
    passportLocal = require('passport-local'), 
    crypto = require('crypto'), 
    Bookshelf = require('bookshelf'), 
    messages = require('./util/messages'); 

var app = express(); 

Bookshelf.mysqlAuth = Bookshelf(knex); 

app.use(cookieParser('halsisiHHh445JjO0')); 
app.use(cookieSession({ 
    keys: ['key1', 'key2'] 
})); 


app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

app.use(expressValidator()); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(passport.authenticate('remember-me')); 
app.use(flash()); 
app.use(serveStatic('./public')); 
//app.use(express.favicon(__dirname + '/public/images/shortcut-icon.png')); 
app.use(messages()); 

app.engine('html', swig.renderFile); 
app.set('view engine', 'html'); 
app.set('views', __dirname + '/views'); 

require('./util/auth')(passport); 
require('./routes')(app, passport); 

app.listen(process.env.PORT || 3000); 

console.log('Listening on port 3000'); 

回答

4

這個錯誤僅僅是說你在調用它之前沒有定義RememberMeStrategy函數(你使用的是new,但是在Javascript中,它只是調用一個函數,它具有一個叫做this的特殊變量)。您需要先require模塊,在這種情況下:

var RememberMeStrategy = require('passport-remember-me').Strategy; 
0

就需要在變量RememberMeStrategy

var RememberMeStrategy= require('passport-remember-me').Strategy;