获取请求未通过授权 header
Get request not passing authorization header
我正在尝试将 GET-request 从我的 Angular front-end 传递到我的 Spring 引导程序 back-end。我正在使用 JWT 对所有内容进行身份验证,并且正在使用 HTTP-interceptor 在请求 header 中添加令牌,如下所示:
@Injectable()
export class Interceptor implements HttpInterceptor {
constructor(public auth: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token: string = this.auth.getToken();
if(this.auth.isAuthenticated()) {
request = request.clone({
setHeaders : { Authorization : `${this.auth.getToken()}`,}
});
}
return next.handle(request);
}
}
我没有看到在 chrome 的请求 header 中添加了令牌:
image link
back-end 也看不到它,因此返回 403。我怀疑这与 CORS 有关(我同时托管 front-end 和 back-end 在同一台机器上,我正在使用 Chrome + CORS 插件)。
所以我尝试允许 CORS 请求到我的 back-end:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.cors().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.anyRequest().authenticated().and().addFilterBefore(new JwTokenFilter(jwTokenProvider), UsernamePasswordAuthenticationFilter.class);
}
这似乎仍然不起作用。我也尝试过使用 Postman 来做同样的事情 GET-request ,这似乎工作得很好。有人可以帮我吗?
同时覆盖 cors 映射或定义 @Bean for CorsMapping
,请定义正确的前端原点我相信它根据您的屏幕截图 allowedOrigins("http://evil.com")
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(true).allowedOrigins("http://evil.com")
.allowedHeaders("Authorization", "Cache-Control", "Content-Type", "Accept", "X-Requested-With", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin")
.exposedHeaders("Access-Control-Expose-Headers", "Authorization", "Cache-Control", "Content-Type", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin")
.allowedMethods("GET", "OPTIONS", "POST", "PUT", "DELETE", "PATCH");
}
}
或者在配置中定义@Bean 或者你也可以定义Filter
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("your origin or * for allow all");
}
};
}
方法二:
@CrossOrigin
在控制器上
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
我正在尝试将 GET-request 从我的 Angular front-end 传递到我的 Spring 引导程序 back-end。我正在使用 JWT 对所有内容进行身份验证,并且正在使用 HTTP-interceptor 在请求 header 中添加令牌,如下所示:
@Injectable()
export class Interceptor implements HttpInterceptor {
constructor(public auth: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token: string = this.auth.getToken();
if(this.auth.isAuthenticated()) {
request = request.clone({
setHeaders : { Authorization : `${this.auth.getToken()}`,}
});
}
return next.handle(request);
}
}
我没有看到在 chrome 的请求 header 中添加了令牌: image link
back-end 也看不到它,因此返回 403。我怀疑这与 CORS 有关(我同时托管 front-end 和 back-end 在同一台机器上,我正在使用 Chrome + CORS 插件)。
所以我尝试允许 CORS 请求到我的 back-end:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.cors().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.anyRequest().authenticated().and().addFilterBefore(new JwTokenFilter(jwTokenProvider), UsernamePasswordAuthenticationFilter.class);
}
这似乎仍然不起作用。我也尝试过使用 Postman 来做同样的事情 GET-request ,这似乎工作得很好。有人可以帮我吗?
同时覆盖 cors 映射或定义 @Bean for CorsMapping
,请定义正确的前端原点我相信它根据您的屏幕截图 allowedOrigins("http://evil.com")
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(true).allowedOrigins("http://evil.com")
.allowedHeaders("Authorization", "Cache-Control", "Content-Type", "Accept", "X-Requested-With", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin")
.exposedHeaders("Access-Control-Expose-Headers", "Authorization", "Cache-Control", "Content-Type", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin")
.allowedMethods("GET", "OPTIONS", "POST", "PUT", "DELETE", "PATCH");
}
}
或者在配置中定义@Bean 或者你也可以定义Filter
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("your origin or * for allow all");
}
};
}
方法二:
@CrossOrigin
在控制器上
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {