获取请求未通过授权标头[关闭]

Posted

技术标签:

【中文标题】获取请求未通过授权标头[关闭]【英文标题】:Get request not passing authorization header [closed] 【发布时间】:2019-03-23 03:38:47 【问题描述】:

我正在尝试将 GET 请求从我的 Angular 前端传递到我的 Spring Boot 后端。我正在使用 JWT 对所有内容进行身份验证,并且我正在使用 HTTP 拦截器在请求标头中添加令牌,如下所示:

@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 的请求标头中添加了令牌: image link

后端也看不到它,因此返回 403。我怀疑这与 CORS 有关(我将前端和后端都托管在同一台机器上,而我我正在使用 Chrome + CORS 插件)。

所以我尝试允许 CORS 请求到我的后端:

@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 请求,这似乎工作得很好。有谁能帮帮我吗?

【问题讨论】:

尝试禁用CORS插件,看看它是否确实将授权标头添加到请求中。 【参考方案1】:

同时覆盖 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");
            
        ;
    

方法 2:

@CrossOrigin 在控制器上

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController 

【讨论】:

非常感谢您的建议!问题似乎是,我正在使用 CORS 插件以及试图解决 Spring-boot 设置上的问题。禁用插件并将 WebMvcConfigurer bean 添加到 Application 类为我解决了这个问题。再次感谢!

以上是关于获取请求未通过授权标头[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:未设置请求授权标头

AugularJS 中的飞行前 OPTIONS 请求未通过授权标头

授权标头未通过 Codeception API 测试

如何在传入的http请求标头中添加授权令牌[关闭]

未使用 jwt_required 注释时,烧瓶路由请求授权标头

对预检请求的响应未通过访问控制检查:在标头中使用身份验证时,它没有 HTTP ok 状态 [关闭]