2016-12-17 3 views
0

Я борюсь с этой проблемой в течение недели и попробовал все, что я могу придумать, и теперь получил где. Ниже приведен код, который я разделил, чтобы показать проблему.Экспресс-сессия 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, там есть вещи.

+0

Вы используете этот сервер локально? Я не совсем уверен, но может быть, вы используете безопасные файлы cookie на экземпляре локального сервера. Возможно, вы захотите попробовать условно настроить файлы cookie на незащищенные для разработки. https://github.com/expressjs/session#cookiesecure –

+0

@ KevinO'Hara Я пробовал без безопасных файлов cookie, и это не имело никакого значения –

ответ

0

Оказалось, что прохождение {session: false} не позволит записать сеанс. Изменение {session: true} приведет к тому, что сессия будет сохранена, и все будет работать так, как ожидалось. Это была «ошибка» в документации паспорт-salesforce, где она включена в их примерный код.

Смежные вопросы