フェザークライアント(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ソケットトランスポートにアップグレードすることを知っています。
それで、二重ログインイベントを防ぐために何かありますか?
あなたの助けをいただければ幸いです。
これは確認済みのバグであり、元々 https://github.com/feathersjs/authentication/issues/673で報告されてい
@daffl 、
これは、2つのログインイベントが表示されるポーリングからWebSocketへのソケットトランスポートの
フェザーサーバーとクライアントをローカルで実行すると、同じローカルネットワークで2つのログインイベントが表示されないことに気づきました。 インターネット経由でクライアントとサーバーを分離すると、ネットワーク遅延が原因である可能性のある2つのログインイベントが
2つのログインイベントを防ぐために、これに対して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つの可能な回避策を考えました。
- フェザークライアントでは、アップグレードがfalseのソケットを構成すると、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つのチャネルに参加しました
最も参考になるコメント
@matiaslopezd 、
トランスポートの順序は、サーバー側ではなくクライアント側で変更する必要があります。
その時点でソケットioを構成しているクライアント側のコードでは、オプションを渡す必要があります。
以下はスニペットの例です。 その中で、「 https://feathers.domain.com 」をフェザーサーバーのURLに置き換えます