Я борюсь с этой проблемой в течение недели и попробовал все, что я могу придумать, и теперь получил где. Ниже приведен код, который я разделил, чтобы показать проблему.Экспресс-сессия js всегда возвращает false для isAuthenticated
Когда я ударил /secure/
, он перенаправляет меня правильно на адрес /oauth/
. Затем, когда я нажимаю «login», авторизация и обратный вызов происходят правильно, и вызывается метод valid_login
. В этом методе req.isAuthenticated()
возвращает true. Затем перенаправление происходит до /secure/
, и при вызове обеспечения_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
, там есть вещи.
Вы используете этот сервер локально? Я не совсем уверен, но может быть, вы используете безопасные файлы cookie на экземпляре локального сервера. Возможно, вы захотите попробовать условно настроить файлы cookie на незащищенные для разработки. https://github.com/expressjs/session#cookiesecure –
@ KevinO'Hara Я пробовал без безопасных файлов cookie, и это не имело никакого значения –