对于isAuthenticated

时间:2016-12-17 20:16:09

标签: javascript node.js session express

我已经在这个问题上打了大约一个星期了,并且已经尝试了我能想到的所有内容并且现在已经到了哪里。下面是我已经删除以显示问题的代码。

当我点击/secure/时,它会将我正确地重定向到/oauth/网址。然后当我点击"登录"授权和回调正确发生,并调用valid_login方法。在此方法中,req.isAuthenticated()返回true。然后重定向回到/secure/,当调用ensure_authenticated时,req.isAuthenticated()总是返回false。

/*jslint browser: true, regexp: true, es5: true, nomen: true */
/*global require, process, console, __dirname */

var express = require('express');
var expressSession = require('express-session');
var morgan = require('morgan');
var passport = require('passport');
var SalesforceStrategy = require('passport-salesforce').Strategy;

var session_options = {
    secret: process.env.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    cookie: {
        secure: true
    }
};

/*jslint unparam: true*/
var valid_login = function (req, res) {
    'use strict';
    res.redirect('/secure/');
};

var ensure_authenticated = function (req, res, next) {
    'use strict';
    if (req.isAuthenticated()) {
        return next();
    }

    res.redirect('/oauth/');
};
/*jslint unparam: false*/

var SalesforceApps = function () {
    'use strict';

    var self = this;

    self.setupVariables = function () {
        self.ipaddress = '127.0.0.1';
        self.port = 5000;

        /*jslint unparam: true*/
        passport.use(new SalesforceStrategy({
            clientID: process.env.SALESFORCE_CLIENTID,
            clientSecret: process.env.SALESFORCE_CLIENTSECRET,
            callbackURL: process.env.SALESFORCE_CALLBACKURL
        }, function (accessToken, refreshToken, profile, done) {
            return done(null, profile);
        }));
        /*jslint unparam: false*/

        passport.serializeUser(function (user, done) {
            done(null, user);
        });

        passport.deserializeUser(function (user, done) {
            done(null, user);
        });
    };

    self.initializeServer = function () {
        self.app = express();

        self.app.set('trust proxy', 1);
        self.app.use(expressSession(session_options));
        self.app.use(passport.initialize());
        self.app.use(passport.session());

        //Authorization
        /*jslint unparam: true*/
        self.app.get('/oauth', function (req, res) {
            res.setHeader('Content-Type', 'text/html');
            res.send('<html><body><a href="/oauth/authorize">login</a></body></html>');
        });
        self.app.get('/oauth/authorize', passport.authenticate('salesforce', {session: false}));
        self.app.get('/oauth/callback', passport.authenticate('salesforce', {session: false}), valid_login);

        //Applications
        self.app.get('/secure/', ensure_authenticated, function (req, res) {
            res.setHeader('Content-Type', 'text/html');
            res.send('<html><body>secure</body></html>');
        });
        /*jslint unparam: false*/
    };

    self.initialize = function () {
        self.setupVariables();
        self.initializeServer();
    };

    self.start = function () {
        self.app.listen(self.port, self.ipaddress, function () {
            console.log('%s: Node server started on %s:%d ...', Date(Date.now()), self.ipaddress, self.port);
        });
    };
};

var zapp = new SalesforceApps();
zapp.initialize();
zapp.start();

我已经尝试过安装一个会话存储,我已经尝试等到nextTick重定向,我几乎尝试了session_options的所有变体,但是没有任何效果。我可以看到cookie存储在浏览器中,如果我在req.session中输出ensure_authenticated的值,那里就会存在内容。

1 个答案:

答案 0 :(得分:0)

事实证明,传递{session: false}会使其不记录会话。更改{session: true}将导致会话存储,并且所有内容都按预期工作。这是一个&#34;错误&#34;在passport-salesforce文档中,它包含在示例代码中。