相关疑难解决方法(0)

如何使用 Spring Security 为 client_credentials 工作流程向 Feign 客户端提供 OAuth2 令牌

概述

我正在尝试编写一个访问公共 REST API 的程序。为了让我能够使用它,我需要提供 OAuth2 令牌。

我的应用程序使用 Spring Boot 2.4.2 和 Spring Cloud 版本 2020.0.1。应用程序本身每 24 小时调用一次 REST API,下载数据并将其存储在数据库中。不同的微服务在其他时间点使用这些数据,并且需要每天刷新数据。

我的方法是使用 OpenFeign 声明使用 REST API 的 REST 客户端并为其提供 OAuth2 令牌。这是一个非常常见的问题,因此我认为机器对机器的client_credentials工作流程已有详细记录。

事实上,我确实找到了一个使用 OpenFeign 执行此操作的简单示例 - 这里: https: //github.com/netshoes/sample-feign-oauth2-interceptor/blob/master/src/main/java/com/sample/feign /oauth2/interceptor/OrderFeignClientConfiguration.java

TL;DR:尝试编写需要 OAuth2 令牌(client_credentials 授予类型)的机器对机器微服务。

问题

这是我的第一次尝试,但不幸的是,随着新的 Spring Security 版本的出现,我似乎无法实例化OAuth2FeignRequestInterceptor,我可能遇到了包问题。然后我继续研究 Spring Security 的文档和新的 OAuth2 重写,可以在这里找到:https ://docs.spring.io/spring-security/site/docs/5.1.2.RELEASE/reference/htmlsingle /#oauth2client .

方法

我的方法是通过RequestInterceptor添加 Authorization Bearer 标头,将当前的 OAuth2 令牌注入 OpenFeign 客户端的请求中。我的假设是,我可以使用 Spring Security OAuth2 层或多或少自动地检索此信息。

使用文档,我尝试OAuth2RegisteredClient为我的拦截器提供一个 bean …

spring-security spring-security-oauth2 spring-cloud-feign

12
推荐指数
1
解决办法
3万
查看次数

如何结合Feign和OAuth 2.0?

我正在使用Spring Feign和Oauth 2.0

我的申请有

  • 1个带有@ EnableOAuth2Sso的Api网关
  • 2使用@EnableResourceServer的服务

当我从其他服务调用服务的api时,我得到了这个例外.

feign.FeignException: status 401 reading TestFeign#test(); content:
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
Run Code Online (Sandbox Code Playgroud)

如何从其他服务调用服务的api?

spring spring-security spring-security-oauth2 spring-oauth2

5
推荐指数
1
解决办法
570
查看次数

Spring Cloud Feign OAuth2请求拦截器不起作用

我正在尝试使用 spring cloud feign 创建一个简单的 REST 客户端来使用使用 OAuth2 安全令牌保护的服务。我正在使用 OAuth2FeignRequestInterceptor 添加不记名令牌,请检查下面的代码。我面临 401。当尝试调试我的代码时,我在请求对象中找不到不记名令牌。

@Configuration
@EnableConfigurationProperties(value=OAuth2ClientCredentialsProperties.class)
@EnableOAuth2Client
@Profile(OAuth2Profiles.CLIENT_CREDENTIALS)
public class ClientCredentialsConfiguration {

    @Autowired
    private OAuth2ClientCredentialsProperties oAuth2ClientCredentialsProperties;

    @Bean
    @Qualifier("ClientCredentialsOAuth2FeignRequestInterceptor")
    public OAuth2FeignRequestInterceptor oauth2schemeRequestInterceptor() {
        return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), oauth2schemeResourceDetails());
    }

    @Bean
    public ClientCredentialsResourceDetails oauth2schemeResourceDetails() {
        ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
        details.setClientId(oAuth2ClientCredentialsProperties.getClientId());
        details.setClientSecret(oAuth2ClientCredentialsProperties.getClientSecret());
        details.setAccessTokenUri(oAuth2ClientCredentialsProperties.getAccessTokenUri());
        details.setScope(oAuth2ClientCredentialsProperties.getScopes());
        return details;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的客户端界面

@FeignClient(name = "test", url = "http://localhost:8080", configuration = ClientCredentialsConfiguration.class)
interface GitHubClient {


    @RequestMapping(value = "/api/v1/products",
            produces = "application/json",
            consumes = "application/json;charset=UTF-8",
            method = RequestMethod.POST)
    ResponseEntity<Object> …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-security-oauth2 spring-cloud-feign spring-cloud-netflix

5
推荐指数
1
解决办法
2万
查看次数

OAuth2 | 客户凭证资源详细信息 | 已弃用

我是 Spring Security 的新手,我遇到过使用 client_credentials 作为 Grant 类型来实现 OAuth2。我正在使用下面的代码,但我收到建议,认为ClientCredentialsResourceDetails、OAuth2RestTemplate 和 OAuth2AccessToken已弃用。

有人可以帮忙解决这个问题吗?

 private String getAuthTocken(){
     final ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
     resourceDetails.setClientId("ceapiClientId");
     resourceDetails.setClientSecret("ceapiClientSecret");
     resourceDetails.setGrantType("client_credentials");
     resourceDetails.setAccessTokenUri("https://auth.abcdcommerce.com/oauth-server/oauth/token");

     final OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resourceDetails);
     final OAuth2AccessToken accessToken = oAuth2RestTemplate.getAccessToken();

     final String accessTokenAsString = accessToken.getValue();
     return accessTokenAsString;
 } 
Run Code Online (Sandbox Code Playgroud)

spring-security spring-boot spring-security-oauth2 spring-oauth2

3
推荐指数
1
解决办法
9991
查看次数