私はこの問題を今一週間戦い続けています。私は考えることができるすべてを試しています。以下は私が問題を示すために削除したコードです。Express jsセッションはisAuthenticatedに対して常にfalseを返します
私が/secure/
にヒットすると、私は/oauth/
のURLに正しくリダイレクトされます。次に、「ログイン」をクリックすると、承認とコールバックが正しく行われ、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();
は、私は私ができるsession_options
の事実上すべてのバリエーションを試したし、何も働いていない、リダイレクトするnextTickまで待ってみました。私はクッキーがブラウザに保存されていることがわかります。req.session
の値をensure_authenticated
に出力すると、その中に何かが存在します。
このサーバーをローカルに実行していますか?私は完全にはわかりませんが、ローカルサーバーインスタンスで安全なCookieを使用している可能性があります。クッキーを条件付きで設定して、開発のために安全でないものにしようとするかもしれません。 https://github.com/expressjs/session#cookiesecure –
@ KevinO'Hara私は安全なクッキーなしで試してみましたが、何の違いもありませんでした。 –