我已经在 AWS 上部署了一个全栈电子商务应用程序。此应用程序由一个 Angular 前端和一个公开某些 REST API 端点(例如产品和产品类别)的 Spring Boot 应用程序组成。
我已经配置了后端,因此只有具有访问令牌的应用程序才能访问一个 API,特别是 Orders。
在我的 Angular 前端中,我实现了一个拦截器,用于向 Orders API 请求添加访问令牌。
我的 REST API 和 Angular 应用程序都以 CloudFront 发行版为前端:
Angular 应用程序的 CF dist 的域。是https://myshop.com
CF 分区的域。公开我的 REST API 的是 https://myshopapi.com/api
对于 REST API 分布式,我将 CORS 配置为允许来自所有来源的 GET 请求。
我访问 https://myshop.com 并单击订单链接,从而向订单 API 发出 GET 请求,以便我可以检索客户的订单,但没有列出任何订单。我检查 Dev Tools 控制台发现以下错误:
Access to XMLHttpRequest at 'https://myshopapi.com/api/orders' from origin 'https://myshop.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
GET https://myshopapi.com/api/orders net:: ERR_FAILED
问题是当 https://myshop.com 向我的其他 REST API 发送 GET 请求时,我没有遇到任何问题。我只在尝试访问 Orders API 时遇到这些错误。
我的Spring Security配置如下:
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// protect endpoint /api/orders
http.authorizeRequests(configurer ->
configurer
.antMatchers("/api/orders/**")
.authenticated())
.oauth2ResourceServer()
.jwt();
// add CORS filters
http.cors();
http.setSharedObject(ContentNegotiationStrategy.class,
new HeaderContentNegotiationStrategy());
Okta.configureResourceServer401ResponseBody(http);
http.csrf().disable();
return http.build();
}
}
飞行前请求是
Options
不是Get
您应该配置 CORS 以允许来自所有来源的 GET
和 Options
请求
见https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request