2016-12-17 6 views
0

私はこの問題を今一週間戦い続けています。私は考えることができるすべてを試しています。以下は私が問題を示すために削除したコードです。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に出力すると、その中に何かが存在します。

+0

このサーバーをローカルに実行していますか?私は完全にはわかりませんが、ローカルサーバーインスタンスで安全なCookieを使用している可能性があります。クッキーを条件付きで設定して、開発のために安全でないものにしようとするかもしれません。 https://github.com/expressjs/session#cookiesecure –

+0

@ KevinO'Hara私は安全なクッキーなしで試してみましたが、何の違いもありませんでした。 –

答えて

0

{session: false}を渡すとセッションが記録されないことが判明しました。 {session: true}を変更すると、セッションが保存され、すべてが正常に機能します。これはパスポート - セールスフォースのドキュメンテーションの「エラー」で、サンプルコードに含まれています。

関連する問題