8

ellou '

期待どおりに機能する一般的なPlayWebSocketメソッドがありますが、ユーザーを認証する必要があります。残念ながら、メソッドでユーザーを識別する最も簡単な方法を試してみると、次のようになります。

public class Application extends Controller {
    public static WebSocket<JsonNode> connect() {
        return new WebSocket<JsonNode>() {

            @Override
            public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) {
                User logged = User.findByUsername(Http.Context.current().request().username());
                // ...
            }
        };
    }
}

エラーが発生します:

java.lang.RuntimeException: There is no HTTP Context available from here.

私の現在の回避策は、ランダムで一意の識別子を渡して表示し、ユーザーモデルに保存することです。ビューからソケットに接続して、指定された識別子を持つユーザーを見つけることができますが、WebSocket接続は1つしかないため、これは完全ではありません。ユーザーごとに、またなりすましを防ぐことはできません。

ユーザーを認証し、なりすまし攻撃を防ぐにはどうすればよいですか?

4

3 に答える 3

1

コードがどこにあるのかわかりませんが、Websocketの初期化(最初の接続)でHTTPリクエストにアクセスできるはずです。つまり、WebSocketソケット接続を開始したときにのみ認証を確認できるはずです。 (後続の呼び出しはHTTPを使用しません。これは、Webscoketsの動作方法です)。

したがって、たとえば、コントローラーでは、次のようなものを使用できます。

public class Application extends Controller {

   public static WebSocket<JsonNode> connect() {

        Logger.info("Username from request = " + request().username());

        return new WebSocket<JsonNode>() {

            @Override
            public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) {
                // ....

            }

        };
    }

}
于 2012-05-07T20:32:53.193 に答える
1

代わりに、HTTP セッションから認証されたユーザー ID を取得しようとしましたか? コンテキストはその時点で利用できるようです。

于 2012-07-03T01:06:42.837 に答える
0

送信したいデータは機密性が高く、この場合はセキュリティがパフォーマンスよりも重要であるため、最終的に 2 段階のメッセージを使用しました。最初にメッセージの WebSocket ID を介して送信し、いくつかの重要ではないデータを送信し、次に AJAX を介してフェッチし、アクションを保護します。ユーザー認証後のメッセージ本文。

質問は開いたままです:もちろん、他の提案がある場合は、投票を変更します:)

于 2012-05-08T11:47:24.630 に答える