2

トークンが再び取り出され、その間に、ユーザが接続されていることを示すノードへの新しいエントリが作成される。そのエントリは削除されず、ゴーストユーザーが作成されます。ユーザプレゼンスと認証

SHA1キーを追加したり、新しいgoogle-services.jsonファイルをプロジェクトに使用したりするなど、複数のソリューションを試しましたが、ほとんど成功しませんでした。私のデータベースから認証ルールを削除すると、これはもはや発生しないので、問題は認証だと思われます。私の最初の認証は、カスタムトークンを介して行われ

I/art: Enabling alloc tracker (65536 entries of 16 frames, taking 8MB) 
W/PersistentConnection: pc_0 - Auth token revoked: expired_token (Auth token is expired.) 
D/EventRaiser: Raising 1 event(s) 
D/EventRaiser: Raising /.info/connected: VALUE: false 
D/Persistence: Starting transaction. 
D/Persistence: Persisted a total of 1 rows and deleted 0 rows for a set at /registered-users/....../lastOnline in 2ms 
D/Persistence: Transaction completed. Elapsed: 38ms 
D/RepoOperation: Aborting transactions for path: /registered-users/....../lastOnline. Affected: /registered-users/....../lastOnline 
D/Persistence: Starting transaction. 
D/Persistence: Persisted a total of 1 rows and deleted 1 rows for a set at /connected-users/....../-KZLNBlImkX978ftO6z1 in 2ms 
D/Persistence: Transaction completed. Elapsed: 6ms 
D/RepoOperation: Aborting transactions for path: /connected-users/....../-KZLNBlImkX978ftO6z1. Affected: /connected-users/....../-KZLNBlImkX978ftO6z1 
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 
D/FirebaseAuth: Notifying listeners about user (......). 
D/FirebaseApp: Notifying auth state listeners. 
D/FirebaseApp: Notified 1 auth state listeners. 
D/RepoOperation: Auth token changed, triggering auth token refresh 
D/EventRaiser: Raising 1 event(s) 
D/EventRaiser: Raising /.info/connected: VALUE: true 
I/CONNECTED: true 
D/RepoOperation: set: /connected-users/....../-KZLTZmyGMvWPdJKmdeV 
D/DataOperation: set: /connected-users/....../-KZLTZmyGMvWPdJKmdeV true 
D/Persistence: Starting transaction. 
D/Persistence: Persisted user overwrite in 1ms 
D/Persistence: Transaction completed. Elapsed: 8ms 
D/RepoOperation: Aborting transactions for path: /connected-users/....../-KZLTZmyGMvWPdJKmdeV. Affected: /connected-users/....../-KZLTZmyGMvWPdJKmdeV 
D/Persistence: Starting transaction. 
D/Persistence: Deleted 1 write(s) with writeId 2 in 1ms 
D/Persistence: Persisted a total of 1 rows and deleted 0 rows for a set at /connected-users/....../-KZLTZmyGMvWPdJKmdeV in 7ms 
D/Persistence: Transaction completed. Elapsed: 34ms 
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 

:ここ

は、問題を示しているいくつかのログです。

答えて

5

ご理解のほど正確です。この問題を軽減するためにSDKを変更していますが、現在のところ、認証トークンが期限切れになると、新しいトークンでデータベースに再接続することになりますが、古い認証トークンはすでに期限切れになっています再接続からのonDisconnect()操作はunauthenticatedで実行されるため、失敗する可能性があります。

いくつかの潜在的な回避策は、次のとおりです。

  1. は手動で60分の有効期限前にトークンリフレッシュを強制することができます。 FirebaseAuth.getInstance().getCurrentUser().getToken(true)を定期的に呼び出すことでこれを行うことができます。新しいトークンはデータベースで自動的に使用されるため、古いトークンは期限切れになりません。

  2. onDisconnect()。removeValue()が認証なしで完了できるようにセキュリティルールを開きます。これは明らかに理想的ではありません。 push-idが他のクライアントによって容易に推測できないという事実は、これを安全に行う方法があることを意味するかもしれませんが、他のクライアントが/ registered-users/$ uid /を読み込まないようにする必要がありますプッシュID)、おそらくあなたのプレゼンス情報の目的を破る。 : - /あなたはまだ潜在的な競合状態がありますけれども、それは再接続する前に、クライアントが本当に消える場合、クライアントは(その「古い」プッシュIDを覚えていて、再接続した後、それを削除する可能性があり

  3. あなたは自動的に(タイムスタンプに基づいて例えば)古いプレゼンスエントリを削除/検出するために、あなたのクライアントを書くことができます。

希望これはあなたにいくつかの助けを与える。バグのため申し訳ありません。私たちは、クライアントに修正を検討していますしかし、いつ着陸するのか分かりません。

+1

私はかなりのオプション(4)を行ってきましたが、うまくいくと思います。接続ごとにTRUEを押すのではなく、現在のトークンの有効期限をプッシュします。私はまだonDisconnectでそれを削除しようとしますが、失敗した場合は、タイムスタンプが過去のものであれば、指定された接続が廃止されていることが分かります。また、適切な瞬間に古いタイムスタンプを見つけて削除します。私が望んでいたより複雑ですが、それは機能します。 – aldel

+0

SDKで問題が修正されたときに通知できるように、問題が発生していますか? (私は主にJSクライアントライブラリに関心を持っていますが、Androidライブラリにも同じ問題があるようです。) – aldel

+0

これらのオプションに加えて、このマイケルを扱うきれいな方法がありましたか? –