最近我已經爲我的Springboot和Angualr2應用程序引入了JWT身份驗證。 在那裏,我試圖在我的Angualr代碼傳遞JWT如下令牌請求Springboot和Angular2的HTTP自定義授權標頭
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;
}
}
但是在它返回的服務器端做一個POST請求狀態代碼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);
}
}
}
我有一個JWT令牌濾波器和內它總是檢查授權報頭。我必須修改該邏輯來忽略用於令牌過濾的OPTION請求並設置狀態200 – keth