angular – HTTP状态代码401,即使我正在发送授权请求标头
最近我在我的Springboot和基于Angualr2的应用程序中引入了JWT身份验证.
在那里我尝试通过在我的Angualr代码中传递如下的JWT令牌来执行POST请求 save(jobId: number,taskId: number,note: Note) { return this.http.post(environment.APIENDPOINT + '/jobs/' + jobId + '/tasks/' + taskId + '/notes',note,this.setHeaders()).map((response: Response) => response.json()); } private setHeaders() { // create authorization header with jwt token let currentUser = JSON.parse(localStorage.getItem('currentUser')); console.log("Current token---"+ currentUser.token); if (currentUser && currentUser.token) { let headers = new Headers(); headers.append('Content-Type','application/json'); headers.append('authorization','Bearer '+ currentUser.token); let r = new RequestOptions({ headers: headers }) return r; } } 但是在服务器端它返回状态码401.问题是在Springboot端它检查授权头如下,它返回null String authToken = request.getHeader("authorization "); 然后我查看了请求标头,它在Access-Control-Request-Headers下有如下的授权标头.但它对服务器端是不可见的. 然后我进一步阅读并发现这可能是CORS配置的问题.所以我修改了我的CORS配置过滤器以使addExposedHeader如下所示 @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addExposedHeader("authorization"); config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("GET"); config.addAllowedMethod("POST"); config.addAllowedMethod("PUT"); config.addAllowedMethod("DELETE"); //config.addExposedHeader("Content-Type"); source.registerCorsConfiguration("/**",config); return new CorsFilter(source); } 服务器仍然抱怨它无法找到Authorization标头.我在这里错过了什么吗?感谢你的帮助 解 在阅读下面的sideshowbarker评论后,我能够理解这个问题背后的基础知识. protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws ServletException,IOException { try { if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); }else{ String authToken = request.getHeader(this.tokenHeader); jWTTokenAuthenticationService.parseClaimsFromToken(authToken); -- } chain.doFilter(request,response); }Catch(AuthenticationException authEx){ SecurityContextHolder.clearContext(); if (entryPoint != null) { entryPoint.commence(request,response,authEx); } } }
您需要将服务器配置为不需要OPTIONS请求的授权(即,请求发送到的服务器 – 而不是服务于您的前端代码的服务器).
那是因为发生的事情是这样的: >您的代码告诉您的浏览器它想要使用Authorization标头发送请求. 更多细节: 问题屏幕截图中的Access-Control-Request-Headers和Access-Control-Request-Method请求标头表明浏览器正在执行CORS preflight OPTIONS request. 在您的请求中存在Authorization和Content-Type:application / json请求标头是您的浏览器执行CORS预检的原因 – 在您的代码中尝试POST请求之前向服务器发送OPTIONS请求.因为OPTIONS预检失败,浏览器就会停在那里,从不尝试POST. 因此,您必须弄清楚发送请求的服务器上当前服务器端代码的哪一部分导致它需要OPTIONS请求的授权,并进行更改,以便它在没有授权的情况下以200或204成功响应响应OPTIONS被要求. 有关为特定的Spring服务器执行此操作的特定帮助,请参阅以下答案: > Disable Spring Security for OPTIONS Http Method (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |