2

ユーザーの認証に失敗しているときに、passport.socketio がこのエラーをスローします。

エラー: エラー: セッションからユーザーをデシリアライズできませんでした

問題を Passport.socketio に絞り込みました/lib/index.js

59行目

  auth.passport.deserializeUser(userKey, function(err, user) {
    if (err)
      return auth.fail(data, err, true, accept);
    ...

そのエラーがスローされます。デバッガーuserKeyは有効であることを通知し、ユーザーを逆シリアル化する必要があります。これは、メイン アプリのパスポートがユーザーを逆シリアル化するために使用するのと同じキーです。(mongoDB オブジェクトの ID です)。私のメインアプリのパスポートは、ユーザーの逆シリアル化に問題はありません。(詳細) なぜこれでもエラーがスローされるのかわかりません。

ここuserKeyで渡されるのは、メインのアプリで逆シリアル化に使用するのと同じキー パスポートです。

userKeyグローバルを作成してメインコードに入れるところまで行きました

  passport.deserializeUser(global.userKey, function(err, user) {
    if (err)
      return auth.fail(data, err, true, accept);
    console.log('ok');

その結果、無限ループが発生します (外側のpassport.deserialize内にあるため)が、iutは「ok」を出力するため、メインアプリのパスポートは、少なくともindex.jsのパスポートと同じものを使用して問題なくデシリアライズできます(passport.socketio\lib\ index.js) できません! .. 何らかの理由で。

次に、メインアプリからパスポートオブジェクト自体を渡そうとしました

io.set('authorization', require('passport.socketio').authorize({
    passport: passport,
    ...

実際にはエラーは発生しません!! socket.handshakeしかし、私はオブジェクトを取得しません。

これをさらに診断するアイデアがありません。何か助けていただければ幸いです。

が「セッションからユーザーを逆シリアル化」しないpassport.socketio原因は何ですか?passport

4

2 に答える 2

3

npm_modules を削除し、packages.json を で書き直した"every_package":"latest"ので、基本的にすべてのパッケージの最新バージョンを再インストールしました。それはそれを修正しました。

于 2014-05-08T14:38:38.690 に答える
2

1 つの問題は、特定の「deserializeUser」実装を使用するようにメイン アプリで「passport」インスタンスを構成したことです。メインアプリでパスポートが初期化されているすべての場所を探します。(mean.io のようなフレームワークの場合は、config/passport.js にあります)。
ソケット アプリのパスポート インスタンスに対して同じ初期化が行われていることを確認します。次のように、passportsocketio に渡します。

passportSocketIo.authorize({
        passport: passport,
        cookieParser: express.cookieParser,
        key: 'connect.sid'
        ...
});
于 2014-05-30T20:48:46.960 に答える