2

Spring Source OAuth2 をクライアントとして使用して、リソース サーバーからユーザー データを取得し、ローカル ユーザーを作成するアプリケーションがあります。OAuth2ClientContextFilter がトークンを取得しようとすると、エラーが発生し続けます。

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [org.springframework.security.oauth2.common.OAuth2AccessToken] and content type [application/x-javascript;charset=utf-8]

デフォルトの MediaType が「application/json」であることを理解しているので、MappingJacksonHttpMessageConverter を次のようにカスタマイズしようとしました。

<bean id="jacksonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <bean class="org.springframework.http.MediaType">
                    <constructor-arg value="application"/>
                    <constructor-arg value="x-javascript"/>
                    <constructor-arg value="UTF-8"/>
                </bean>
            </list>
     </property>
</bean>

*/*また、コンテンツ タイプをサポートするはずの 'ALL' コンストラクター引数も試しましたが、うまくいきませんでした。http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/http/MediaType.htmlを参照

その他の重要な情報は、現在すべての XML 構成を使用していることです。2.5 アプリを 3.1.1 にアップグレードしました。コントローラーではなく、春のセキュリティ PRE_AUTH フィルターで OAuth2RestTemplate を使用しています。したがって、残りの呼び出しをマップするために注釈を使用していません。追加してみまし<context:annotation-config/>たが、違いはありませんでした。

カスタム AbstractPreAuthenticatedProcessingFilter から OAuth サービス Bean を呼び出すだけです。サービス Bean がユーザー データの残りの呼び出しを実行しようとすると、例外がスローされ、トークンを取得しようとする OAuth2ClientContextFilter がトリガーされます。これが私の OAuth2 サービス Bean 構成です。

<bean id="reprintsOauthService" class="com.coral.user.ReprintsOauthService">
    <property name="reprintsUserInfoUrl" value="https://www.demo.com/api/userinfo.ashx" />
    <property name="reprintsRestTemplate">
        <bean class="org.springframework.security.oauth2.client.OAuth2RestTemplate">
            <constructor-arg ref="reprintsResource"/>
            <property name="messageConverters">
                <list>
                   <ref bean="jacksonConverter"/>
                </list>
            </property>
        </bean>
    </property>
</bean> 

何か不足していますか?Jackson が応答をマッピングしないのはなぜですか?

4

2 に答える 2

6

修理済み!問題は、トークンの取得に OAuth2RestTemplate が使用されていないことです。そのため、org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport をカスタマイズし、既存のメソッドに MappingJacksonHttpMessageConverter を次のように追加する必要がありました。

  public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    this.messageConverters = new ArrayList<HttpMessageConverter<?>>(messageConverters);
    this.messageConverters.add(new FormOAuth2AccessTokenMessageConverter());
    this.messageConverters.add(new FormOAuth2ExceptionHttpMessageConverter());

    MappingJacksonHttpMessageConverter jackson = new MappingJacksonHttpMessageConverter();
    List<MediaType> mediaTypes = new ArrayList<MediaType>();
    mediaTypes.add(new MediaType("application", "x-javascript"));
    jackson.setSupportedMediaTypes(mediaTypes);
    this.messageConverters.add(jackson);

    if(logger.isDebugEnabled())
    {
        logger.debug("*** Added custom media type 'application/x-javascript' to the Jackson converter");
    }
}
于 2012-03-27T23:46:31.893 に答える
3

「 oauth RestClientException: 応答を抽出できませんでした: 応答タイプに適した HttpMessageConverter が見つかりませんでした」を検索して、この質問にたどり着きました。

あなたの答えは、問題を解決するために必要なヒントでした! 次のMaven依存関係を追加しました (oauth2 pom ではオプションです)。

<!-- spring oauth2 json dependency: -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.3.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.3.2</version>
</dependency>

AuthorizationCodeAccessTokenProviderを作成するときに、jackson メッセージ コンバーターを追加しました。

protected AuthorizationCodeAccessTokenProvider getAccessTokenProvider() {
    final AuthorizationCodeAccessTokenProvider oAuthProvider = new AuthorizationCodeAccessTokenProvider();
    final List<HttpMessageConverter<?>> messageConv = new ArrayList<HttpMessageConverter<?>>();
    messageConv.add(new MappingJackson2HttpMessageConverter());
    oAuthProvider.setMessageConverters(messageConv);
    return oAuthProvider;
}
于 2015-07-01T09:13:29.150 に答える