Feathers: ログインイベントは、socket.ioを使用して同じユーザーに対して2回発行されます

作成日 2019年01月18日  ·  10コメント  ·  ソース: feathersjs/feathers

再現する手順

フェザークライアント(socket.io)を使用して認証をセットアップし、ログインイベントをフェザーAPIサーバーに追加します(フェザーエクスプレスおよびソケットモジュールを使用してフェザーサーバーをセットアップします)。
ユーザーがUIから認証すると、featherは同じユーザーに対してログインイベントを2回発行します。

予想される行動

同じユーザーがUIから認証するときに、1つのログインイベントを発行する必要があります。

実際の動作

アプリフェザーサーバーを介してユーザーがログインすると、同じユーザーに対してログインイベントが2回発行されます。

システム構成

セットアップの該当する部分について教えてください。

モジュールバージョン(特に機能していない部分):
フェザーサーバー:
"@ feathersjs / authentication": "2.1.6"、
"@ feathersjs / authentication-jwt": "2.0.1"、
"@ feathersjs / authentication-local": "1.2.1"、
"@ feathersjs / configuration": "1.0.2"、
「@feathersjs / express」:「1.2.2」、
「@feathersjs / feathers」:「3.2.3」、
「@feathersjs / socketio」:「3.2.1」
フェザークライアント:
@feathersjs / 3.7.6
NodeJSバージョン
8.9.3
オペレーティングシステム
ホスト:Ubuntu 16.04.5 LTS(x86_64)
コンテナ画像:高山:3.7

私はfeathersocket.ioが最初にプーリングトランスポートを使用し、その後Webソケットトランスポートにアップグレードすることを知っています。
それで、二重ログインイベントを防ぐために何かありますか?
あなたの助けをいただければ幸いです。

Authentication Bug

最も参考になるコメント

@matiaslopezd

トランスポートの順序は、サーバー側ではなくクライアント側で変更する必要があります。
その時点でソケットioを構成しているクライアント側のコードでは、オプションを渡す必要があります。
以下はスニペットの例です。 その中で、「 https://feathers.domain.com 」をフェザーサーバーのURLに置き換えます

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio-client');
const io = require('socket.io-client');
const app = feathers();
const socket = io("https://feathers.domain.com", {
    transports: ['websocket','polling'],
    forceNew: true
});

app.configure(socketio(socket));

全てのコメント10件

これは確認済みのバグであり、元々 https://github.com/feathersjs/authentication/issues/673で報告されてい

@daffl

これは、2つのログインイベントが表示されるポーリングからWebSocketのソケットトランスポートの

フェザーサーバーとクライアントをローカルで実行すると、同じローカルネットワークで2つのログインイベントが表示されないことに気づきました。 インターネット経由でクライアントとサーバーを分離すると、ネットワーク遅延が原因である可能性のある2つのログインイベント

2つのログインイベントを防ぐために、これに対して2つの可能な回避策を考えました。

  1. フェザークライアントでは、アップグレードがfalseのソケットを構成すると、2つのログインイベントが表示されません。
  2. または、configure transportをこの順序で配置すると、2つのログインイベントトランスポートは表示されません

私は現在、トランスポートを逆順、つまりフォールバックアプローチで使用しています。 そのため、2つのログインイベントが発生しません。
これは一時的な修正であることがわかっています。理想的には、ソケットがそれを防ぐか、それに関連して2つのログアウトを起動する必要があります。

これapp.emit is not a function 、ユーザーがログインしようとしたときに

この@vinaykharechaを掘り下げてくれてありがとう。 これがAuthenticationv3(https://github.com/feathersjs/feathers/issues/1045)で発生しなくなったことを確認します

@daffl

これは、2つのログインイベントが表示されるポーリングからWebSocketのソケットトランスポートの

フェザーサーバーとクライアントをローカルで実行すると、同じローカルネットワークで2つのログインイベントが表示されないことに気づきました。 インターネット経由でクライアントとサーバーを分離すると、ネットワーク遅延が原因である可能性のある2つのログインイベント

2つのログインイベントを防ぐために、これに対して2つの可能な回避策を考えました。

  1. フェザークライアントでは、アップグレードがfalseのソケットを構成すると、2つのログインイベントが表示されません。
  2. または、configure transportをこの順序で配置すると、2つのログインイベントトランスポートは表示されません

私は現在、トランスポートを逆順、つまりフォールバックアプローチで使用しています。 そのため、2つのログインイベントが発生しません。
これは一時的な修正であることがわかっています。理想的には、ソケットがそれを防ぐか、それに関連して2つのログアウトを起動する必要があります。

輸送の順序を変更した@vinaykharecha ? ありがとう!

@matiaslopezd

トランスポートの順序は、サーバー側ではなくクライアント側で変更する必要があります。
その時点でソケットioを構成しているクライアント側のコードでは、オプションを渡す必要があります。
以下はスニペットの例です。 その中で、「 https://feathers.domain.com 」をフェザーサーバーのURLに置き換えます

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio-client');
const io = require('socket.io-client');
const app = feathers();
const socket = io("https://feathers.domain.com", {
    transports: ['websocket','polling'],
    forceNew: true
});

app.configure(socketio(socket));

@vinaykharechaありがとうございます! :スマイル:

これはFeathersv4認証では発生しないはずなので、終了します。 アップグレード方法の詳細については、移行ガイドを参照してください。

@daffl新しいバージョン? :悲鳴:

私は再びこの問題を抱えており、v4を使用しています。
私の設定:
"@ feathersjs / authentication-client": "^ 4.5.1"、
"@ feathersjs / feathers": "^ 4.5.1"、
"@ feathersjs / socketio-client": "^ 4.3.11"、

接続の結果:
認証が成功しました:xyz // console.log from authenticate
新しい接続要求。 イベントは次のとおりです。login// handleConnectionから
接続への認証情報の追加:xyz // handleConnectionから
新しい接続要求。 イベントは:ログイン
接続への認証情報の追加:xyz
匿名接続リクエスト//チャネルから、app.on( 'connection'、....しかし、接続は既知です
ユーザーxyzが6つのチャネルに参加しました//チャネルからapp.on( 'login'、....。
ユーザー[email protected]が6つのチャネルに参加しました

このページは役に立ちましたか?
0 / 5 - 0 評価