spring oauth 和客户端凭据 M2M 调用
spring oauth and client credentials M2M calls
我有一个使用 spring-cloud-secuirty
和 spring-cloud-oauth2
保护的前端网站。我所有的后端资源都使用 @EnableResourceServer
保护。
来自 UI 对这些资源服务的所有请求都通过 Zuul 网关授权,但我的问题是后端任务被安排到 运行 每天或触发一个通过电子邮件。这些任务未经授权,正如我从阅读中了解到的那样,它们应该被认证为 client_credentials
。但是我无法弄清楚如何配置假客户端以在尝试与安全资源通信之前获取访问代码。
我创建了一个示例 project,在这个项目中,除了任务服务外,其他所有东西都在工作
添加下面的拦截器就可以了,但我不确定这是最好的解决方案
@Component
public class Interceptor implements RequestInterceptor {
private final OAuth2RestTemplate template;
public Interceptor(ClientCredentialsResourceDetails oauth2RemoteResource) {
template = new OAuth2RestTemplate(oauth2RemoteResource, new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()));
}
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("Authorization", "bearer " + template.getAccessToken().getValue());
}
}
更好的方法
经过更多阅读,我发现 spring-cloud-security 已经有一个拦截器,所以我们只需要声明一个 OAuth2FeignRequestInterceptor
类型的 bean,如下所示
@Configuration
@EnableOAuth2Client
@Slf4j
public class OAuth2FeignAutoConfiguration {
@Bean
public OAuth2FeignRequestInterceptor oAuth2FeignRequestInterceptor(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) {
return new OAuth2FeignRequestInterceptor(oauth2ClientContext,details);
}
}
我有一个使用 spring-cloud-secuirty
和 spring-cloud-oauth2
保护的前端网站。我所有的后端资源都使用 @EnableResourceServer
保护。
来自 UI 对这些资源服务的所有请求都通过 Zuul 网关授权,但我的问题是后端任务被安排到 运行 每天或触发一个通过电子邮件。这些任务未经授权,正如我从阅读中了解到的那样,它们应该被认证为 client_credentials
。但是我无法弄清楚如何配置假客户端以在尝试与安全资源通信之前获取访问代码。
我创建了一个示例 project,在这个项目中,除了任务服务外,其他所有东西都在工作
添加下面的拦截器就可以了,但我不确定这是最好的解决方案
@Component
public class Interceptor implements RequestInterceptor {
private final OAuth2RestTemplate template;
public Interceptor(ClientCredentialsResourceDetails oauth2RemoteResource) {
template = new OAuth2RestTemplate(oauth2RemoteResource, new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()));
}
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("Authorization", "bearer " + template.getAccessToken().getValue());
}
}
更好的方法
经过更多阅读,我发现 spring-cloud-security 已经有一个拦截器,所以我们只需要声明一个 OAuth2FeignRequestInterceptor
类型的 bean,如下所示
@Configuration
@EnableOAuth2Client
@Slf4j
public class OAuth2FeignAutoConfiguration {
@Bean
public OAuth2FeignRequestInterceptor oAuth2FeignRequestInterceptor(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) {
return new OAuth2FeignRequestInterceptor(oauth2ClientContext,details);
}
}