web-dev-qa-db-ja.com

SockJSで認証ヘッダーを提供する

多数のRESTエンドポイントとWebSocketエンドポイントを提供するSpringMVCサーバーがあります。ログインエンドポイント以外はすべて認証が必要です。JWTを使用してクライアントからのリクエストを認証しています。

ユーザーがログインすると、JWTトークンを含むX-AUTH-TOKENヘッダーが返されます。このトークンは、サーバーへのすべてのリクエストで同じヘッダーに渡されます。これはすべてRESTエンドポイントで正常に機能しますが、WebSocketでこれを行う方法がわかりません。

私はSockJSを使用しており、接続を開くと次のようになります。

var socket = new SockJS('/socket/updates', null, {});

これにより、/ socket/updates/info?t = xxxへのGETリクエストが発生し、403が返されます(すべてがデフォルトで認証を必要とするため)。

理想的には、SockJSが行うXHRリクエストでX-AUTH-TOKENヘッダーを送信するだけですが、APIを見てヘッダーを追加する方法がわかりません。

最悪の場合、SockJSを変更してこれを行うことができますが、この機能が意図的に省略されているかどうか疑問に思っていますか? SockJSがセキュリティ上の理由でCookieをサポートしていないことは知っていますが、それは私がやろうとしていることではありません。

また、テストのために、情報エンドポイントに匿名アクセスを許可しましたが、それは他の多くのエンドポイント上にあります-サーバーセキュリティに穴を開けるよりも、これらのリクエストに認証の詳細を渡す方がエレガントです。

助けていただければ幸いです。

乾杯

10
L Morris

SockJSからヘッダーを設定することはできません。 SockJSにこの機能がないからではなく、ブラウザメーカーがこのAPIをJavascriptに公開していないからです。見る:

https://github.com/sockjs/sockjs-client/issues/196

回避策については、 SpringベースのSockJS/STOMP WebSocketを使用したJSONWeb Token(JWT) を参照してください。

4
Raman

クライアント側:

stompClient.connect({headername:header}, function () {
                setConnected(true);
                stompClient.subscribe(request.topic, function (message) {
                    output(message.body);
                });
            });

サーバ側 :

StompHeaderAccessor accessor
                        = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

 String headervalue= accessor.getNativeHeader("your header name").get(0);
0
ahll