Spring Security 6.5: OAuth 認可コード交換をプロキシ経由にする
Spring Security の認可コードのトークン応答クライアントにプロキシ対応の RestClient を渡し、OAuth コンバーターとエラーハンドラーはそのまま維持します。
ブラウザーは ID プロバイダーに到達しますが、アプリケーションが返された認可コードを交換するときにログインが失敗します。この交換はアプリケーションサーバーからの外向きリクエストであり、独自の HTTP クライアントを持ちます。
Spring Security 6.5 で利用できる RestClient ベースの API では、認可コードのトークン応答クライアントにプロキシ対応のリクエストファクトリを渡します:
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
java.net.Proxy.Type.HTTP,
new java.net.InetSocketAddress("proxy.example", 8080)));
factory.setConnectTimeout(5000);
factory.setReadTimeout(15000);
RestClient tokenHttp = RestClient.builder()
.requestFactory(factory)
.messageConverters(converters -> {
converters.clear();
converters.add(new FormHttpMessageConverter());
converters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
})
.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
.build();
RestClientAuthorizationCodeTokenResponseClient tokenClient =
new RestClientAuthorizationCodeTokenResponseClient();
tokenClient.setRestClient(tokenHttp);
コンバーターとエラーハンドラーのクラスは、Spring Security の文書化されたトークンリクエストの動作を保ちます。無関係な JSON API のためだけに構成された汎用 RestClient は、同等の代替にはなりません。
同じ tokenClient を既存のセキュリティ構成に接続します:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
これらは、クライアント登録と SecurityFilterChain をすでに持つアプリケーション向けの構成断片です。認証なしの HTTP プロキシを選択します。資格情報を必要とするプロキシには、選択したトランスポートの対応する認証構成が必要です。許可された公開ルート上で公開到達可能な HTTPS トークンエンドポイントには、HTTP プロキシ一覧の HTTP エントリでそのアカウント不要のプロキシアドレスを埋められます。
プロキシのホストは、ポートと URL スキームから分けて扱います。ID プロバイダーのトークン URI は宛先のままにします。この例は証明書の検証を置き換えるものではありません。
後続のリクエストには独自の所有権チェックが必要です。UserInfo の取得、リフレッシュトークンの交換、client_credentials グラント、保護された API 呼び出しは別のクライアントオブジェクトを使えます。その操作にもルートが必要な場合は、対応するサポート対象クライアントを構成します。Spring Security 6.5 のリアクティブな client_credentials フローでは、リアクティブなトークンクライアントとそのグラントプロバイダーを別途構成します。
OAuth2RestTemplate と AccessTokenProvider を使う古い例は、古い Spring Security OAuth プロジェクトに属します。コードを適応する前に、インストール済みアプリケーションが使う API を選んでください。これらのオブジェクトをこの構成に混ぜないでください。