最近,我向基于 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);
}
服务器仍然抱怨它找不到授权标头。我在这里错过了什么吗?感谢你的帮助
解决方案
阅读下面的 sideshowbarker 评论后,我能够理解问题背后的基础知识。在我的项目中,我有一个 JWT 令牌过滤器,它始终检查授权标头。然后我将它修改如下,现在它按预期工作
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);
}
}
}