2016-06-13 10 views
4

私はPassport 0.3.2でExpress 4を使用しているアプリを持っています。 /sessionエンドポイントにユーザー名とパスワードが送信されたときに正しいユーザー情報を取得しているpassport-local戦略を設定しました。PassportJSとExpress 4がクッキー/セッションを正しく保存しない

ただし、ユーザー情報は決して正しく保存されません。したがって、req.userはすべてのリスナーで常に未定義であり、req.isAuthenticated()は常にfalseを返します。

私は、ミドルウェアの設定に問題があることが多い他の投稿を見ましたが、正しい方法で注文しているので、ここからどこに行くのか分かりません。ここで

app.post("/session", 
    passport.authenticate('local'), 
    (req: any, res: any) => { 
     // if we reach this point, we authenticated correctly 
     res.sendStatus(201); 
    } 
); 

は私LocalStrategyセットアップです:ここで

passport.use(new LocalStrategy(
    (username, password, done) => { 
     let users = userRepository.getAll(); 

     let usernameFilter = users.filter(u => u.getUsername() === username); 
     if (!usernameFilter || usernameFilter.length !== 1) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 

     if (!password || password !== "correct") { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 

     return done(null, usernameFilter[0]); 
    } 
)); 

は私のアプリの設定です:

let app = express(); 
app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(expressSession({ 
    secret: 'my secret key', 
    resave: true, 
    saveUninitialized: true 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

私は以下を使用しています。ここ

/sessionのための私のPOSTリスナーです依存バージョン:

"body-parser": "^1.15.1", 
"cookie-parser": "^1.4.3", 
"express": "^4.13.4", 
"express-session": "^1.13.0", 
"passport": "^0.3.2", 
"passport-local": "^1.0.0" 

しかし私は、エラーがスローされ、私のPOST /sessionにコールバックを追加しました。

app.post("/session", 
    passport.authenticate('local', { 
     session: false 
    }), 
    (req: express.Request, res: express.Response) => { 
     req.logIn(req.user, (err: any) => { 
      if (err) 
       throw err; 
     }); 

     // if we reach this point, we authenticated correctly 
     res.sendStatus(201); 
    } 
); 

私は次のエラーがスローされます:パスポートのドキュメントから

Error: Failed to serialize user into session

+0

あなたのPOSTで – pulse0ne

答えて

2

Note that when using a custom callback, it becomes the application's responsibility to establish a session (by calling req.login()) and send a response.


ああ、良い、私たちが作っている進歩これが私のコールバックです。ユーザー情報をシリアライズして逆シリアル化するようにパスポートを構成する必要があります。詳細については、thisを参照してください。 Userを独自のデータベースアクセスオブジェクトに置き換えることに注意してください。

+0

Thanks @ pulse0neにパスポートの '.login()'関数を呼び出す必要があると思います。これを追加してエラーを受け取りました。私は主な質問を更新しました。 –

+0

@JamesMongerそれは実際には良い兆候だ、あなたはそれが適切に働くことに近づいている。私は私の答えを更新しました – pulse0ne

-1

私は関連する問題が発生したときにGoogle検索からこの質問を見つけました。

私が実現したことは、express-sessionはセッションを持続させないということでした。サーバーの再起動の間。 Read here for more info

だから私が代わりにcookie-sessionためexpress-sessionをスワップ:

app.use(cookieSession({ 
    name: 'MyAppName', 
    keys: ['very secret key'], 
    maxAge: 30 * 24 * 60 * 60 * 1000 // 30 days 
})); 

をそしてPassportJSは、必要に応じてさらなる変化を私のセッションを永続ませんでした!

関連する問題