2016-08-02 6 views
3

Я пытаюсь понять, как использовать объект OAuth2RestTemplate потреблять мой OAuth2 обеспеченной службу REST (который работает под другим проектом, и давайте предположим, что и на другой сервере и т.д. ...)Как использовать OAuth2RestTemplate + Spring 4?

F.E. моя служба остальное:

https://localhost:8443/rest/api/user

-> Доступ к этому URL генерирует ошибку, поскольку я не аутентификацией

Чтобы запросить маркер я бы пойти в:

https://localhost:8443/rest/oauth/token?grant_type=password&client_id=test&client_secret=test&username=USERNAME & password = PASSW ДОВ

После того как я получить маркер, то я могу подключиться к REST API, используя следующий URL-адрес (например, маркер вставляется)

https://localhost:8443/rest/api/user?access_token=

В настоящее время я пытался что-то со следующими объектами:

@EnableOAuth2Client 
@Configuration 
class MyConfig { 

    @Value("${oauth.resource:https://localhost:8443}") 
    private String baseUrl; 
    @Value("${oauth.authorize:https://localhost:8443/rest/oauth/authorize}") 
    private String authorizeUrl; 
    @Value("${oauth.token:https://localhost:8443/rest/oauth/token}") 
    private String tokenUrl; 

    @Bean 
    protected OAuth2ProtectedResourceDetails resource() { 

     ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails(); 

     List scopes = new ArrayList<String>(2); 
     scopes.add("write"); 
     scopes.add("read"); 
     resource.setAccessTokenUri(tokenUrl); 
     resource.setClientId("test"); 
     resource.setClientSecret("test"); 
     resource.setGrantType("password"); 
     resource.setScope(scopes); 

     resource.setUsername("test"); 
     resource.setPassword("test"); 

     return resource; 
    } 

    @Bean 
    public OAuth2RestOperations restTemplate() { 
     CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()) 
       .build(); 
     HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); 
     requestFactory.setHttpClient(httpClient); 
     AccessTokenRequest atr = new DefaultAccessTokenRequest(); 
     OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(atr)); 
     AuthorizationCodeAccessTokenProvider provider = new AuthorizationCodeAccessTokenProvider(); 
     provider.setRequestFactory(requestFactory); 
     restTemplate.setAccessTokenProvider(provider); 
     return restTemplate; 
    } 

} 

Я пытаюсь получить токен в контроллере, как показано ниже.

@Controller 
public class TestController { 

    @Autowired 
    private OAuth2RestOperations restTemplate; 

    @RequestMapping(value="/", method= RequestMethod.GET) 
    public String TestForm() { 
     System.out.println("Token : " + restTemplate.getAccessToken().getValue()); 
    } 
} 

Но я получил ниже за исключением

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/web] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails cannot be cast to org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails] with root cause 
java.lang.ClassCastException: org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails cannot be cast to org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails 
    at org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider.obtainAccessToken(AuthorizationCodeAccessTokenProvider.java:190) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:221) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:173) 
    at com.divyshivglobalinvestor.web.controller.PersonalLoanController.PersonalLoanForm(PersonalLoanController.java:37) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082) 
    at org.apache.coyote.AreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:722)bstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.Th 

С некоторого блога я обнаружил, что, если нам нужно предоставить пароль, то вместо ResourceOwnerPasswordResourceDetails, он должен быть использован AccessTokenRequest (который является карта и является эфемерный). Было бы здорово, если кто-то может помочь мне в получении доступа. :)

Заранее благодарен!

ответ

2

Вы должны использовать ResourceOwnerPasswordAccessTokenProvider вместо AuthorizationCodeAccessTokenProvider в restTemplate боба

+0

Спасибо за ответ! Можете ли вы привести любой рабочий пример –