我正在尝试编写一个访问公共 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 Feign和Oauth 2.0
我的申请有
当我从其他服务调用服务的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 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
我是 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