我已经在这个问题上打了大约一个星期了,并且已经尝试了我能想到的所有内容并且现在已经到了哪里。下面是我已经删除以显示问题的代码。
当我点击/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
的值,那里就会存在内容。
答案 0 :(得分:0)
事实证明,传递{session: false}
会使其不记录会话。更改{session: true}
将导致会话存储,并且所有内容都按预期工作。这是一个&#34;错误&#34;在passport-salesforce文档中,它包含在示例代码中。