2016-03-27 15 views
11

私はログインリクエストに対して200の応答を得ましたが、deserializeUserは決して呼び出されなかったので、それ以上の認証チェック要求に対しては401があります。私はパスポートのソースに分割し、パスポートがreq._passport.session.userが存在するかどうかをチェックし、そうでない場合はdeserializeUserを呼び出さないことに気付きました。パスポートdeserializeUserメソッドが呼び出されなかった

私はstackoverflowに関する他の質問を検索しましたが、私は特定のケースがあるようです。フロントエンド、http://localhost:3000バックエンド)私はbodyParse、cookieParser、急行セッションを使用

、パスポートを初期化し、パスポートセッション -

は、単一のローカル戦略の認証タイプがありますが、私は、CORS設定が設定されたログイン要求を行うために、http://localhost:8080は、Ajaxリクエストを使用します。 Expressセッションのセキュリティ:httpを介して認証リクエストを実行するとfalseが設定されます。

ここで私のプロジェクトを見つけることができます(バックエンドpackage.jsonは使えますので、それを使うことができます、フロントエンドは分かりません)。少なくとも、そこのコードをチェックできます。

バックエンドhttps://github.com/rantiev/template-api フロントエンドhttps://github.com/rantiev/template-angular

Expressセッションの設定とCORSは

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var rememberMe = require('../../modules/rememberMe'); 
var createAccessToken = require('../../modules/createAccessToken'); 

var bcrypt = require('bcrypt-nodejs'); 

var UserM = require('../users/userM'); 

module.exports = function (app, mainRouter, role) { 

    passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passwordField: 'password' 
    }, function (username, password, done) { 

     UserM.findOneQ({email: username}) 
      .then(function(user){ 

       if (user && bcrypt.compareSync(password, user.password)) { 
        done(null, user); 
       } else { 
        done(null, false); 
       } 

      }) 
      .catch(function(err){ 
       done(err); 
      }); 

    })); 

    passport.serializeUser(function (user, done) { 

     console.log('serialize'); 

     if (user) { 
      createAccessToken(user, done); 
     } else { 
      done(null, false); 
     } 
    }); 

    passport.deserializeUser(function (token, done) { 

     console.log('deserialize'); 

     UserM.findOneQ({accessToken: token}) 
      .then(function(user){ 

       if (user) { 
        done(null, user); 
       } else { 
        done(null, false); 
       } 

      }) 
      .catch(function(err){ 
       done(err); 
      }); 

    }); 

    app.use(passport.initialize()); 
    app.use(passport.session()); 

    mainRouter.post('/me', passport.authenticate('local'), function (req, res) { 
     res.status(200).send(); 
    }); 

    mainRouter.get('/logout', function (req, res) { 
     req.logout(); 
     res.redirect('/'); 
    }); 

    mainRouter.get('/me', function (req, res) { 

     if (!req.user) { 
      res.status(401).send('Please Login!'); 
      return; 
     } 

     var currentUser = { 
      id: req.user._id, 
      role: req.user.role 
     }; 

     res.status(200).json(currentUser); 
    }); 

}; 
+0

私は同じ問題を抱えていますが、これを解決しましたか? – Jeffpowrs

+0

いいえ、解決策があるときはここで答えてくれます。タイムアウトを与えました。私はこれまでにできたことはすべてできましたが、うまくいきませんでした) – Rantiev

+0

ログイン要求は、後続のリクエストで返されたCookieを設定していると思われ、そのCookieには発行したアクセストークンがあります。 –

答えて

0

https://github.com/rantiev/template-api/blob/master/api/authentication/authenticationR.jsあなたはmaxAgeを試してみましたhttps://github.com/rantiev/template-api/blob/master/modules/appConfigure.js

var path = require('path'); 
var bodyParser = require('body-parser'); 
var session = require('express-session'); 
var cookieParser = require('cookie-parser'); 
var MongoStore = require('connect-mongo')(session); 

module.exports = function (app, express, config, mongoose) { 

    app.use(cookieParser()); 
    app.use(bodyParser.urlencoded({ 
     extended: true 
    })); 
    app.use(bodyParser.json()); 

    app.use(function (req, res, next) { 

     // Website you wish to allow to connect 
     res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080'); 

     // Request methods you wish to allow 
     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 

     // Request headers you wish to allow 
     res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, X-AUTHENTICATION, X-IP, Content-Type, Origin, Accept, Cookie'); 

     // Set to true if you need the website to include cookies in the requests sent 
     // to the API (e.g. in case you use sessions) 
     res.setHeader('Access-Control-Allow-Credentials', true); 

     // Pass to next layer of middleware 
     next(); 
    }); 

    /*app.use(function (req, res, next) { 
     console.log('coockie is:', req.cookies); 
    });*/ 

    app.use(session({ 
     saveUninitialized: false, 
     resave: false, 
     secret: config.sessionsSecretToken, 
     cookie: { 
      secure: false 
     }, 
     store: new MongoStore({ mongooseConnection: mongoose.connection }) 
    })); 

    app.use(express.static(path.join(__dirname, '..' , 'public'))); 

}; 

パスポート構成はここにあるここですか?

app.use(express.session({ store: sessionStore, 
          cookie: { maxAge : 3600000 } //1 Hour 
          })); 
+0

うん、私はしました。 私は実際に問題の状態を忘れていました。私がそれを解決したかどうかにかかわらず、私は過去1年間すべてのモジュールを更新し、すべてがうまくいったようです。 – Rantiev

1

あなたのコールスタックで見て、req._passport.session.userが設定されていないためdeserializeUserが呼び出されていないことが判明した場合、次のようにあなたの問題があります。問題のある行がexpress-sessionモジュールにあります。

store.generate = function(req){ 
req.sessionID = generateId(req); 
req.session = new Session(req); // THIS 
req.session.cookie = new Cookie(cookieOptions); 

if (cookieOptions.secure === 'auto') { 
    req.session.cookie.secure = issecure(req, trustProxy); 
} 
}; 

しかし、req.sessionIDセットを有することが可能であり、req.sessionがnullである一方で、req._passport.session.userを説明している:セッションIDは、generateが呼び出されない設定されている場合

if (!req.sessionID) { 
    debug('no SID sent, generating session'); 
    generate(); 
    next(); 
    return; 
} 

nullの場合req.sessionは設定されません。

req.sessionIDが設定されていて、さらに新しいクッキーが設定されていることがあります。

なぜですか?私は知らないし、誰かがさらに調査するのが大好きですが、基本的に教訓はcookie-sessionモジュールを代わりに使ってみることです。

関連する問題