最近、私はSpringbootとAngualr2ベースのアプリケーションに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;
}
}
しかし私Angualrコードでトークンとして以下のJWTを渡すことにより、POSTリクエストを実行しようとしましたステータスコード401です。問題はSpringboot側で以下のように承認ヘッダーをチェックし、nullを返します
String authToken = request.getHeader("authorization ");
次に、私はリクエストヘッダーを見て、以下のようにAccess-Control-Request-Headersの下に承認ヘッダーを持っています。しかし、それはサーバー側には見えません。
それから私は、さらに読み、これがCORS構成に問題がある可能性がありますことを見出しました。だから、私はまだサーバーがAuthorizationヘッダを見つけることができないと文句を言い
@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);
}
以下のようaddExposedHeaderを持っている私のCORS構成フィルタを変更しました。私はここで何かを逃したのですか?以下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