使用 Spring oauth2 使用 OAuth 保护的 REST Web 服务

Posted

技术标签:

【中文标题】使用 Spring oauth2 使用 OAuth 保护的 REST Web 服务【英文标题】:Consume an OAuth-secured REST webservice using Spring oauth2 【发布时间】:2015-10-05 19:28:46 【问题描述】:

我想使用来自使用 oauth2 保护他的资源的服务器的 REST Web 服务。

我使用 Spring boot (JHipster)。

要做到这一点,我在SecurityConfiguration 类中有这个:

@Value("$oauth.resource:http://sercverUsingOAuth2")
private String baseUrl;

@Value("$oauth.authorize:http://sercverUsingOAuth2/rest/oauth/token")
private String authorizeUrl;

@Value("$oauth.token:http://sercverUsingOAuth2/rest/oauth/token")
private String tokenUrl;

@Bean
public OAuth2RestOperations oauth2RestTemplate() 
    AccessTokenRequest atr = new DefaultAccessTokenRequest();
    return new OAuth2RestTemplate(resource(),
            new DefaultOAuth2ClientContext(atr));


@Bean
protected OAuth2ProtectedResourceDetails resource() 
    AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();
    resource.setAccessTokenUri(tokenUrl);
    resource.setUserAuthorizationUri(authorizeUrl);
    resource.setClientId("client_id");
    resource.setClientSecret("client_secret");
    resource.setGrantType("grant_type");
    return resource;

此类 (SecurityConfiguration) 使用以下注释:

@Configuration
@EnableWebSecurity
@EnableOAuth2Client

这是我的controller(Spring MVC):

@RestController
@RequestMapping("/consume")
public class MyContrtoller 

@Inject
private OAuth2RestOperations oauth2RestTemplate;

@RequestMapping(value = "/oauth2", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<DataModel> getProducts() 

    ResponseEntity<MyModel> forEntity = oauth2RestTemplate
            .getForEntity("http://sercverUsingOAuth2/rest/resourceToConsume",
                    MyModel.class);
    return forEntity.getBody().getData();

但是,当我想使用我的网络服务 (http://myHost/consume/oauth2) 时,我得到了这个异常:

    org.springframework.security.oauth2.client.resource.OAuth2AccessDeniedException:
 Unable to obtain a new access token for resource 'null'. The provider manager
 is not configured to support it.

我用谷歌搜索过,我发现了这个:

github ***

但这对我没有帮助。

谢谢。

【问题讨论】:

你会发现这个话题很有用:***.com/a/28278293/604218 感谢@Reberto 的回复。 我不需要用户名和用户密码来使用 Web 服务,因为托管此 ws 的服务器允许我使用以下方式使用此 ws:client_id、client_secret 和 grant_type。 PS:当我使用其他客户端应用程序时,我得到了令牌表单服务器,但使用我的 java 代码却不能。 这个问题你解决了吗? 不,我没有找到任何解决方案! 【参考方案1】:

您对授权 url 和令牌 url 使用相同的 URL。这是我的第一个线索,然后我看到了你的 cmets。

即使您更改了授权类型,您仍然使用“AuthorizationCodeResourceDetails”,而您应该使用“ClientCredentialsResourceDetails”。这种类型的 ResourceDetails 旨在用于您正在解释的案例。

ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails();
resource.setAccessTokenUri(TOKEN_URL);
resource.setClientId(CLIENT_ID);
resource.setClientSecret(CLIENT_SECRET);
resource.setClientAuthenticationScheme(AuthenticationScheme.form); //This line isn't always needed
return resource;

【讨论】:

谢谢@DaShaun :)。你帮我

以上是关于使用 Spring oauth2 使用 OAuth 保护的 REST Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Oauth2 初探

Spring security oauth2 - 从 OAuth2 主体获取自定义数据

如何使用spring-security,oauth2调整实体的正确登录?

如何使用 Oauth2 和 javascript 客户端(Spring Oauth2 + Angularjs)实现长期登录会话

如何使用 OAuth2RestTemplate + Spring 4?

使用 oAuth2 /oAuth/Token 请求 405 方法的 Spring Security 不允许