2016-11-20 9 views
0

Web APIを使用しています。このフローは次のようになります:Passport + Express認証を使用しているときにブラウザにCookieが保存されていません

ユーザーはウェブサイトにログインします - >パスポートはユーザーを認証します - Passportはユーザーに関する情報を永続セッションに保存します - >ユーザーはセッションがある限りAPIにアクセスできます有効です。

残念ながら、私はPassportを取得して永続セッションを作成できません。ログイン部分が機能します(有効なユーザーのみが通過します)が、Passportはセッションに関する情報をクライアントのブラウザに保存しません。その結果、ユーザーはこの時点からAPIにアクセスすることはできません。

Server.js:

// call the packages we need 
var express = require('express');  // call express 
var app  = express();     // define our app using express 
var bodyParser = require('body-parser'); // for accesing data from POST requests 
var passport = require('passport');   // for user authentication 
var flash = require('connect-flash'); // for session management 
var cookieParser = require('cookie-parser');// for reading cookies 

// Setup the database connection 
var configDB = require('./config/database.js'); 
var mongoose = require('mongoose'); 
mongoose.connect(configDB.url); 

// Pull schema for training 
var Training = require('./models/training'); 

// configure app 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 


// required for passport 
require('./config/passport')(passport); // pass passport for configuration 

app.use(require('express-session')({ 
    cookie : { 
    maxAge: 3600000, // see below 
    secure: false 
    }, 
    secret: 'khugugjh', 
    resave: false, 
    saveUninitialized: true 
})); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); // use connect-flash for flash messages stored in session 

... 

routes.js:

... 

// the login route 

    router.route('/login').post(
    passport.authenticate('local-login'), 
    function(req, res) { 
    // If this function gets called, authentication was successful. 
    // `req.user` contains the authenticated user. 
    console.log('logged in: ' + req.user); 
    }); 

... 

パスポートを次のように問題の外観に関連するコードの

パーツ.js:

... 

// the serilization and deserilization functions for Passport 

passport.serializeUser(function(user, done) { 
     console.log('Serialize: ' + user); 
     return done(null, user._id); 
    }); 

    // used to deserialize the user 
    passport.deserializeUser(function(id, done) { 
     console.log('trying to des'); 
     User.findById(id, function(err, user) { 
      console.log('Deserialize: ' + user); 
      return done(err, user); 
     }); 
    }); 


... 
+0

あなたがローカルホストのような他のポートで実行されているすべてのフロントエンドのフレームワークを使用しています:3000 Expressのアプリとlocalhostです:1234は角アプリです –

答えて

1

問題が発生している理由の1つは、リクエストがクライアント側から行われていることと関係があります。 ES6 fetch APIを使用している場合は、キーcredentials"include"の値でoptionsオブジェクトに渡す必要があります。例えば

fetch('/restricted', { 
     method: 'get', 
     credentials: 'include' 
    }); 

は、これは私のために問題を修正しました。また、express-sessionv1.5.0を使用している場合は、cookie-parserミドルウェアが不要であることに注意してください。

希望に役立ちます。

追加リソース:https://developers.google.com/web/updates/2015/03/introduction-to-fetch

関連する問題