2013-02-02 38 views
2

我不確定我是否正確配置了OAuth2RestTemplate。當我運行測試儀類時出現以下錯誤。如何設置OAuth2RestTemplate(Post Updated)

INFO: Pre-instantiating singletons in org.s[email protected]1df3248: defining beans [propertyConfigurer,dataSource,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,emf,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,accountRepository,questionRepository,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,jpaQuestionService,jpaAccountService,passwordEncoder,accountHelper,tradeConfig,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#1,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,baseOAuth2ProtectedResourceDetails,oAuth2ProtectedResourceDetails,accessTokenRequest,oAuth2ClientContext,oAuth2RestTemplate]; root of factory hierarchy 
Exception in thread "main" error="access_denied", error_description="Unable to obtain a new access token for resource 'null'. The provider manager is not configured to support it." 
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:146) 
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainAccessToken(AccessTokenProviderChain.java:118) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:216) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:168) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.createRequest(OAuth2RestTemplate.java:89) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:442) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:123) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:385) 
    at com..main(Tester.java:44) 

@Configuration 
public class AppConfig { 

@Bean 
//@Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) 
public BaseOAuth2ProtectedResourceDetails baseOAuth2ProtectedResourceDetails(){ 
    BaseOAuth2ProtectedResourceDetails baseOAuth2ProtectedResourceDetails = new BaseOAuth2ProtectedResourceDetails(); 
    baseOAuth2ProtectedResourceDetails.setClientId(clientId); 
    baseOAuth2ProtectedResourceDetails.setClientSecret(clientSecret); 
    return baseOAuth2ProtectedResourceDetails; 
} 

@Bean 
public DefaultAccessTokenRequest accessTokenRequest(){ 
    return new DefaultAccessTokenRequest(); 
} 

@Bean 
public OAuth2ClientContext oAuth2ClientContext(){ 
    return new DefaultOAuth2ClientContext(accessTokenRequest()); 
} 

@Bean 
public OAuth2RestTemplate oAuth2RestTemplate(){ 
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(baseOAuth2ProtectedResourceDetails(),oAuth2ClientContext()); 
    return restTemplate; 
} 
} 

Tester類

public class Tester { 

public static void main(String[] args) { 

    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); 
    ctx.load("classpath*:jpa-app-context.xml"); 
    ctx.refresh(); 

EntityManagerFactory emf = (EntityManagerFactory) ctx.getBean("emf"); 
EntityManager em = emf.createEntityManager(); 
TransactionSynchronizationManager.bindResource(emf , new EntityManagerHolder(em)); 
OAuth2RestTemplate oAuth2RestTemplate = (OAuth2RestTemplate) ctx.getBean("oAuth2RestTemplate"); 

//OAuth2RestTemplate oAuth2RestTemplate = ctx.getBean(OAuth2RestTemplate.class); 
String uri="https:api.."; 


Object obj = oAuth2RestTemplate.exchange(uri, HttpMethod.POST, null, Object.class); 
System.out.println("Tester Object: "+ obj.toString()); 
} 
} 
+0

Wilx:你能解決問題了嗎?如果是,請提供您的完整運行代碼? – Prateek

回答

3

我面臨同樣的異常,但與其他受保護的資源類型。

通常,僅當AccessTokenProviderChain找不到適用於特定*ProtectedResourceDetails實例的適當*AccessTokenProvider時,異常纔會引發。這意味着,當您嘗試執行以下操作:

ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails(); 

resource.setAccessTokenUri(url); 
resource.setClientId(clientId); 
resource.setClientSecret(secret); 
resource.setGrantType("password"); 

return resource; 

的代碼需要一個client_credentials撥款類型,因爲我們使用ClientCredentialsResourceDetails,但我們傳遞password值。

這裏,在我的情況下工作的代碼:

private OAuth2ProtectedResourceDetails withOAuth2Authentication(final String url, final String clientId, final String secret) { 
    ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails(); 

    resource.setAccessTokenUri(url); 
    resource.setClientId(clientId); 
    resource.setClientSecret(secret); 
    // here you can provide additional properties such as scope etc. 

    return resource; 
} 

@Bean 
RestTemplate callbackClientV2() { 
    AccessTokenRequest atr = new DefaultAccessTokenRequest(); 

    return new OAuth2RestTemplate(
       withOAuth2Authentication(v2ServerUrl, v2Username, v2Password), 
       new DefaultOAuth2ClientContext(atr) 
    ); 
}