私は、Springフレームワークを使用して簡単なWebアプリケーションクライアントを作成しました。私はOAuth2RestTemplateを使用して、TLS/SSL接続が必要なサードパーティのRESTサービスを呼び出しています。 HTTPSポートを使用するようにTomcatを設定し、作成したキーストアファイルを指定しました。 Tomcat localhost上で動作するクライアントアプリケーションをサードパーティのリソースプロバイダに登録しました。私はクライアントのID、秘密、およびセキュリティ設定XMLファイルで指定したその他の詳細を持っています。私は、Webクライアントを登録する際に、「Authorization Code Grant Type」を選択しました。Oauth 2 + Springセキュリティ - 取得403エラーForbidden Error
リクエストをすると、自分のWebクライアントのフォームログインにリダイレクトされます。そこで認証された後、私は第三者のリソースプロバイダのサイトにリダイレクトされ、ユーザーを認証します。ユーザー名とパスワードを入力すると、要求を承認または拒否する必要があるページが表示されます。この後私は403禁じられたエラーを得ている。サードパーティのRESTサービスプロバイダのサイトをチェックすると、私のPOST要求のためにトークンが生成されたことがわかります。ログは、Httpコード200 Okでも同じことを示します。しかし、私は私の要求のGet呼び出しを使用してリソースにアクセスするためにトークンを使用するとき、403 Forbiddenエラーが発生していると思います。
私はこの問題についてかなりの時間をデバッグして研究してきましたが、これまでのところ運がありませんでした。どんな助けでも大歓迎です!
ここにはいくつかのコードスニペットがあります。
security-config.xml
:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:oauth2="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/security/oauth2
http://www.springframework.org/schema/security/spring-security-oauth2.xsd">
<authentication-manager>
<authentication-provider>
<user-service>
<user name="mm" password="mm" authorities="ROLE_MAIL_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>
<http pattern="/**">
<intercept-url pattern="/login.jsp" access="permitAll()" requires-channel="https"/>
<intercept-url pattern="/css/**" access="permitAll()" requires-channel="https"/>
<intercept-url pattern="/images/**" access="permitAll()" requires-channel="https"/>
<intercept-url pattern="/login" access="permitAll()" requires-channel="https"/>
<!-- <intercept-url pattern="/**" access="hasRole('ROLE_MAIL_USER')" requires-channel="https"/> -->
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
login-processing-url="/login"/>
<logout logout-success-url="/build-newsletter.html"/>
<csrf/>
<port-mappings>
<port-mapping http="8080" https="8443" />
</port-mappings>
<custom-filter ref="leg1Filter" after="EXCEPTION_TRANSLATION_FILTER"/>
</http>
<oauth2:resource id="tResource" client-id="myclientid"
user-authorization-uri="https://thirdpartyhost/sss/authorize"
access-token-uri="https://thirdpartyhost/oauth2/sss/token"
client-secret="somesecret"
type="authorization_code"
scope="read,write"/>
<oauth2:rest-template id="tOAuthTemplate" resource="tResource"/>
<oauth2:client id="leg1Filter"/>
</beans:beans>
マイコントローラー:へのリダイレクト
@Controller
public class TAppController
{
String endPoint = rest api endpoint;
@Autowired
private OAuth2RestTemplate tOAuthTemplate;
@RequestMapping("/tEventDetails.html")
public ModelAndView getEventDetails() {
List<TEventData> tEventData = (List<TEventData>) tOAuthTemplate.getForObject(endPoint + "tEvents", TEvent.class).getData();
return new ModelAndView("/tDetailsPage.jsp", "tDetails", tEventData);
}
}
:ここ
がログから一部抜粋です:
13:10:34,957 DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory:449 - Creating instance of bean 'scopedTarget.org.springframework.security.oauth2.client.token.DefaultAccessTokenRequest#1'
13:10:34,960 DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory:477 - Finished creating instance of bean 'scopedTarget.org.springframework.security.oauth2.client.token.DefaultAccessTokenRequest#1'
13:10:34,968 DEBUG org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider:159 - Retrieving token from *****thirdpartyhost/oauth2/ss/token
13:10:34,982 DEBUG org.springframework.web.client.RestTemplate:78 - Created POST request for "https://thirdpartyhost/ss/super/token"
13:10:34,983 DEBUG org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider:221 - Encoding and sending form: {grant_type=[authorization_code], code=[cjtjlstkw7uzt7rvim0xq3ogl], redirect_uri=[****localhost:8443/mm/tDetails.html]}
***13:10:35,383 DEBUG org.springframework.web.client.RestTemplate:569 - POST request for "***thirdpartyhost/ss/oauth2/token" resulted in 200 (OK)
13:10:35,403 DEBUG*** org.springframework.web.client.HttpMessageConverterExtractor:92 - Reading [interface org.springframework.security.oauth2.common.OAuth2AccessToken] as "application/json" using [org.springfr[email protected]4997b84c]
13:10:35,600 DEBUG org.springframework.security.oauth2.client.OAuth2RestTemplate:78 - Created GET request for "*****thirdpartyhost/v7/ss/me/tEvents?limit=5"
13:10:35,628 DEBUG org.springframework.security.oauth2.client.OAuth2RestTemplate:669 - Setting request Accept header to [application/json, application/*+json]
13:10:35,797 WARN ***org.springframework.security.oauth2.client.OAuth2RestTemplate:581 - GET request for "****thirdpartyhost/v7/ss/tEvents" resulted in 403 (Forbidden); invoking error handler***
13:10:35,804 DEBUG org.springframework.web.client.HttpMessageConverterExtractor:92 - Reading [class org.springframework.security.oauth2.common.exceptions.OAuth2Exception] as "application/json;charset=UTF-8" using [org.springfr[email protected]161bd9ce]
13:10:35,806 DEBUG org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver:134 - Resolving exception from handler [[email protected]]: org.springframework.web.client.HttpClientErrorException: 403 Forbidden
13:10:35,807 DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver:134 - Resolving exception from handler [[email protected]]: org.springframework.web.client.HttpClientErrorException: 403 Forbidden
13:10:35,807 DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver:134 - Resolving exception from handler [[email protected]]: org.springframework.web.client.HttpClientErrorException: 403 Forbidden
13:10:35,807 DEBUG org.springframework.web.servlet.DispatcherServlet:984 - Could not complete request
org.springframework.web.client.HttpClientErrorException: 403 Forbidden
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.security.oauth2.client.http.OAuth2ErrorHandler.handleError(OAuth2ErrorHandler.java:165)
at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:588)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:546)
at org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:128)
番目からeログ私は、認証コードと引き換えにトークンを取得するためのPOSTリクエストが成功したことを見ることができます。しかし、リソースサーバーからリソース/データにアクセスするためにGETリクエストを行うとき、403禁止されたエラーが表示されます。
これについて詳しく説明できますか?私も同様の問題に直面しています。 – theLearner
クライアントを残りのサービスプロバイダに登録するときに適切な設定を使用する方がより関連していました。また、Webサービスのドメインやセキュリティグループなどのセキュリティ設定が、クライアントが呼び出すのに正しいことを確認してください。 – sadaphvi