当前位置: 首页 > 知识库问答 >
问题:

OAuth2RestTemplate与Ribbon Eureka

邵星河
2023-03-14

我正在使用Spring Cloud和Netflix OSS Eureka和Ribbon开发微服务。我有另一个服务作为oauth-server运行,它提供OAuth2令牌。我的所有微服务都向Eureka注册,包括oauth-server。如果我使用oauth-server的硬编码url作为“clientCredentialsResourceDetails.setAccessTokenUri(”http://localhost:9000/oauth/token“);”,但我的整个解决方案是有效的,但是当我尝试使用Eureka Discovered url of oauth-server,如“clientCredentialsResourceDetails.setAccessTokenUri(”http://oauth-server/oauth/token“);”我收到错误: java.net.UnknownHostException: oauth-server

MyConfig.java

@Bean(name = "myOauth2RestTemplate")
@LoadBalanced
public OAuth2RestOperations restTemplate(RestTemplateCustomizer customizer,
                                             ClientCredentialsResourceDetails resourceDetails) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
    ClientCredentialsAccessTokenProvider provider = new ClientCredentialsAccessTokenProvider();
    restTemplate.setAccessTokenProvider(provider);
    customizer.customize(restTemplate);
    return restTemplate;
}

@Bean
public ClientCredentialsResourceDetails resourceDetails() {
    ClientCredentialsResourceDetails clientCredentialsResourceDetails = new ClientCredentialsResourceDetails();
    clientCredentialsResourceDetails.setAccessTokenUri("http://oauth-server/oauth/token");
    clientCredentialsResourceDetails.setId("1");
    clientCredentialsResourceDetails.setClientId("candy");
    clientCredentialsResourceDetails.setClientSecret("123");    
    clientCredentialsResourceDetails.setScope(Arrays.asList("read", "write"));
    clientCredentialsResourceDetails.setGrantType("client_credentials");
    return clientCredentialsResourceDetails;
}

MyController.java

@Autowired
@Qualifier("myOauth2RestTemplate")
@LoadBalanced
private OAuth2RestTemplate myOauth2RestTemplate;

@GetMapping("/secure/hello")
public String getSecureData() {
    String result = myOauth2RestTemplate.getForObject("http://securems/secure/hello", String.class);
    return result;
}

我已经搜索了很多文档和在线帮助,但这些解决方案都不起作用。我认为这应该是一个简单的配置问题,现在已经耗尽了我两天的精力。

共有1个答案

傅砚
2023-03-14

我终于能够用下面的代码让它工作:

@Bean
@LoadBalanced
public OAuth2RestTemplate restTemplate(SpringClientFactory clientFactory) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails());
    RibbonLoadBalancerClient ribbonLoadBalancerClient = new RibbonLoadBalancerClient(clientFactory);
    LoadBalancerInterceptor loadBalancerInterceptor = new LoadBalancerInterceptor(ribbonLoadBalancerClient);
    ClientCredentialsAccessTokenProvider accessTokenProvider = new ClientCredentialsAccessTokenProvider();
    accessTokenProvider.setInterceptors(Arrays.asList(loadBalancerInterceptor));
    restTemplate.setAccessTokenProvider(accessTokenProvider);

    return restTemplate;
}
 类似资料:
  • 问题内容: 我正在尝试了解如何使用OAuth2RestTemplate对象来消耗我的OAuth2安全的REST服务(该服务在不同的项目下运行,并且假设在其他服务器上也是如此…) 我的休息服务是: ->访问此URL会产生错误,因为我未通过身份验证 要请求令牌,我将前往: 收到令牌后,我可以使用以下URL(插入示例令牌)连接到REST API。 现在,我的问题是如何实现第二个可以使用此OAuth2安全

  • 我想使用OAuth2客户端凭据流在两个资源服务器之间进行服务间通信。一切正常,只是我无法在对远程资源服务器的OAuth2RestTemplate调用中使用服务名称(功能区负载均衡器功能)而不是主机名。 我的一个资源服务器(调用另一个资源服务器)具有以下配置: build.gradle 包含尤里卡和功能区的条目 使用此OAuth2RestTemplate的服务 使用服务名(即< code > htt

  • 我在我的Spring boot应用程序中使用OAuth2RestTemplate,并通过它使用一些资源,因为它封装了所有身份验证信息,所以我可以只发送请求,而不用担心令牌和其他身份验证内容。 在我并行发送请求之前,一切都很好。 由于OAuth2RestTemplate有一个作用域(它是本地的,因为它包含用户的会话相关信息),当我试图在多线程环境中使用它时,我得到以下异常 组织。springfram

  • 通过使用以下curl命令,我能够访问令牌并获得以下响应curl用户名:password@machinename:11002/appName/oauth/token-d grant\u type=password-d username=loginFormUserID-d password=loginFormUserPassword 响应:{“实体\ id”:9,“实体\类型”:“刷新\标记”:“ey

  • 我有一系列配置为使用Spring Boot和Cloud OAuth2 SSO的微服务项目。它具有以下组件: Spring Boot 1.3.0 Spring Cloud Brixton。M3 auth server具有Spring Boot 1.2.7和Cloud Angel。SR4 Zuul代理(网关) 验证服务器 资源服务器 用户界面服务器 尤里卡服务器 基本流程是: 使用URL解析UI服务器

  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?