OAuth 2 仕様から、
クライアントは、「application/x-www-form-urlencoded」を使用して次のパラメーターを送信することにより、トークン エンドポイントに要求を行います。
アクセス トークン リクエストは を使用する必要がありますapplication/x-www-form-urlencoded
。
Spring セキュリティでは、リソース所有者のパスワード認証情報付与フローはResourceOwnerPasswordTokenGranter#getOAuth2Authentication
Spring Security で処理されます。
protected OAuth2Authentication getOAuth2Authentication(AuthorizationRequest clientToken) {
Map parameters = clientToken.getAuthorizationParameters();
String username = (String)parameters.get("username");
String password = (String)parameters.get("password");
UsernamePasswordAuthenticationToken userAuth = new UsernamePasswordAuthenticationToken(username, password);
パラメータを送信username
しpassword
てリクエストすることができます。
本当に JSON を使用する必要がある場合は、回避策があります。ご覧のとおり、リクエストパラメーターusername
からpassword
取得されます。したがって、JSON ボディからリクエスト パラメータに渡すと機能します。
アイデアは次のようなものです。
- カスタム スプリング セキュリティ フィルターを作成します。
- カスタム フィルターで、クラスを作成してサブクラスにし
HttpRequestWrapper
ます。このクラスを使用すると、元のリクエストをラップし、JSON からパラメーターを取得できます。
- のサブクラスで
HttpRequestWrapper
、リクエスト本文の JSON を解析してusername
、password
およびを取得し、grant_type
それらを元のリクエスト パラメータとともに new に配置しHashMap
ます。getParameterValues
次に、 、getParameter
、getParameterNames
およびのメソッドをオーバーライドgetParameterMap
して、新しい値を返すHashMap
- ラップされたリクエストをフィルタ チェーンに渡します。
- Spring Security Config でカスタム フィルターを構成します。
これが役立つことを願っています