簡體   English   中英

Express JS會話始終為isAuthenticated返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM