5

私はSpring OAuth2から始めています。ユーザー名とパスワードを /oauth/token エンドポイントに POST 本文の application/json 形式で送信したいと考えています。

curl -X POST -H "Authorization: Basic YWNtZTphY21lc2VjcmV0" -H "Content-Type: application/json" -d '{
"username": "user",
"password": "password",
"grant_type": "password"
}' "http://localhost:9999/api/oauth/token"

それは可能ですか?

アドバイスをお願いできますか?

4

6 に答える 6

3

OAuth 2 仕様から、


クライアントは、「application/x-www-form-urlencoded」を使用して次のパラメーターを送信することにより、トークン エンドポイントに要求を行います。

アクセス トークン リクエストは を使用する必要がありますapplication/x-www-form-urlencoded

Spring セキュリティでは、リソース所有者のパスワード認証情報付与フローはResourceOwnerPasswordTokenGranter#getOAuth2AuthenticationSpring 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);

パラメータを送信usernamepasswordてリクエストすることができます。

本当に JSON を使用する必要がある場合は、回避策があります。ご覧のとおり、リクエストパラメーターusernameからpassword取得されます。したがって、JSON ボディからリクエスト パラメータに渡すと機能します。

アイデアは次のようなものです。

  1. カスタム スプリング セキュリティ フィルターを作成します。
  2. カスタム フィルターで、クラスを作成してサブクラスにしHttpRequestWrapperます。このクラスを使用すると、元のリクエストをラップし、JSON からパラメーターを取得できます。
  3. のサブクラスでHttpRequestWrapper、リクエスト本文の JSON を解析してusernamepasswordおよびを取得し、grant_typeそれらを元のリクエスト パラメータとともに new に配置しHashMapます。getParameterValues次に、 、getParametergetParameterNamesおよびのメソッドをオーバーライドgetParameterMapして、新しい値を返すHashMap
  4. ラップされたリクエストをフィルタ チェーンに渡します。
  5. Spring Security Config でカスタム フィルターを構成します。

これが役立つことを願っています

于 2016-07-03T08:52:14.930 に答える