node.js - Passport.js 记住我功能

标签 node.js express passport.js passport-local

https://github.com/jaredhanson/passport-remember-me

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');
};

登录.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');
    }
}

服务器.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');

最佳答案

该错误只是说您在调用 RememberMeStrategy 函数之前没有定义它(您正在使用 new 但在 Javascript 中,这只是用称为 this 的特殊变量)。您需要首先require该模块,在本例中:

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

关于node.js - Passport.js 记住我功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33036730/

相关文章:

javascript - 在同步函数中调用异步函数 (setinterval) 后返回值

javascript - 如何在 NodeJS 中控制应用程序的流程

node.js - 将 flash 消息从路由器显示到 ejs View

python - 我无法从 Express 应用程序执行 python 脚本

javascript - node.js 使用 Passport 登录

graphql - Nestjs azure 事件目录和 graphql - UseGuard

node.js - Socket.io 在部署后无法工作 - 抛出错误 - 405(不允许)

javascript - 单击 "Home"链接后索引页发生变化

javascript - 在 Sinatra 上使用 express.js 而不是 Ruby 的想法?

node.js - Passport JS 中的 req.isAuthenticated() 是如何实现的?