[英]Node js passport's req.isAuthenticated returns always false
[英]Express js session always returns false for isAuthenticated
我已經為這個問題解決了大約一個星期,並且嘗試了所有我能想到的事情,並且現在已經到達了哪里。 以下是我為說明問題而精簡的代碼。
當我點擊/secure/
它將正確地重定向到/oauth/
url。 然后,當我單擊“登錄”時,授權和回調會正確進行,並調用valid_login
方法。 在此方法中, req.isAuthenticated()
返回true。 重定向然后返回到/secure/
並且在調用req.isAuthenticated()
時, 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存儲在瀏覽器中,並且如果我在ensure_authenticated
輸出req.session
的值,則req.session
存在內容。
事實證明,傳遞{session: false}
將使其不記錄會話。 更改{session: true}
將導致會話被存儲,並且一切將按預期工作。 這是護照銷售人員文檔中的“錯誤”,該錯誤包含在示例代碼中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.