2017-05-30 7 views
0

express4でnodejsアプリケーションでpassportjsを使用しようとしています。テスト目的のために、セッションを維持するためにsession-file-storeを使用しています。Passportjsのセッションに関する問題

私はセッションとpassportjs設定方法:しかし

this.app.use(session({ 
    secret: process.env.SESSION_SECRET || configuration.session_secret, 
    store: new fileStore(), 
    resave: false, 
    saveUninitialized: false 
})); 

// config authentication 
this.app.use(passport.initialize()); 
this.app.use(passport.session()); 
// Configure Passport 
passport.use('local-login', new localStrategy.Strategy(
    (username, password, done) => { 
     Services.users.authenticatePromise(username, password).then(
      function(token) { 
      done(null, token); 
      }, 
      function(err) { 
      done(null, false, err); 
      }, 
    ).done(); 
    }, 
)); 
    // Serialize user in session 
passport.serializeUser((token: AccessToken, done) => { 
    let user = { 
    _token: token.accessToken, 
    _expiryInAt: token.expiryInMs + new Date().getTime(), 
    }; 
    done(null, user); 
}); 

passport.deserializeUser((sessionUser, done) => { 
    done(null, sessionUser); 
}); 

は、私が午前問題は、ユーザーがログインしている前に、私はセッションには何も書いていない場合は、passportjsが正常に動作していることです。しかし、ショッピングカートの詳細のようなセッションにデータを書き込もうとすると、passportjsはユーザートークンをセッションストアにもうシリアル化できなくなります。ログインは成功しません。

私には何が欠けていますか?

+0

あなたは 'req.session = {...}'または類似した何かをやっていますか?私。セッションオブジェクト全体を新しいもので上書きします。 – robertklep

+0

いいえ、私は次のようにしました: '' 'if(!req.session ['basket']){ req.session ['basket'] = {}; } '' ' – rzhomx

+0

申し訳ありませんが、シリアル化に失敗しているので、とにかく問題ではありません。 'passport.serializeUser/deserializeUser'の実装をあなたの質問に追加できますか?また、「シリアル化できないだろう」ということは、まさにその意味ですか? – robertklep

答えて

0

あなたが見ることができるコードにはいくつかの問題があります。

最初に、serializeUserはオブジェクトを取得し、文字列(通常は一意のIDまたはデータベースキー)を返す必要があります。あなたの関数は現在、文字列を受け取り、オブジェクトを返します。それは後ろ向きです。

deserializeUserは文字列を取り、ユーザーオブジェクトを返す必要があります。あなたの関数は現在、オブジェクトを受け取り、その同じオブジェクトを返します。

最後にserializeUserdeserializeUserは互いに逆でなければなりません。つまり、パスポートはdeserializeUser(serializeUser(user))に電話して元のユーザーオブジェクトを取り戻すことができます。ですから、このような何かするつもりだ

:詳細は

passport.serializeUser((user, done) => { 
    return user.id; 
}); 

passport.deserializeUser((id, done) => { 
    getUserFromDatabase({id: id}, function(err, user) { 
    if (err) { 
     done(err, null); // something went wrong; return error 
    } else if (!user) { 
     done(null, false); // no user found; return `false` 
    } else { 
     done(null, user); // return user 
    } 
    }); 
}); 

はこちらを参照してください。Understanding passport serialize deserialize

+0

あなたは正しいです。それは確かにベストプラクティスではありませんが、私はそれが私が見ている問題の理由ではないと思います。まず、ログインする前にセッションに何も書き込まないと、このserializeUser/deserializeUserは正常に動作します。ユーザーをセッションストアにシリアル化してデシリアライズすることができます。そして、私はpassportjsでユーザIDの代わりにAPIトークンを使用しようとしています。 – rzhomx