Я работал над этим в течение последних 7 часов и, похоже, ничего не добился. Я пытаюсь сделать свой XSRF-TOKEN доступным для внешнего интерфейса (Angular 6). Тем не менее, кажется, что это никогда не доступно. Когда я выполняю анализ на вкладке "Сеть" и смотрю в разделе "Готовить ie", кажется, что он находится там во всем своем великолепии. Однако, если я использую CookieService Angular и пытаюсь получить его, ничего не возвращается.
Что нужно иметь в виду:
- При запуске на моей локальной машине я могу чтобы получить XSRF-TOKEN и поместить его в будущие запросы заголовков.
- Проблема возникает, когда два интерфейса и серверная часть (Spring-boot) размещены на двух разных хостах, но в одном домене. Например: Frontend может быть frontend.home.com; Backend может быть backend.home.com.
- HttpOnly имеет значение False.
- Angular Свойство withCredentials также имеет значение true.
Я был бы очень признателен за любые предложения о том, как решить эту, казалось бы, тривиальную, но разочаровывающую проблему.
Спасибо.
Backend:
http.httpBasic()
.authenticationEntryPoint(new AuthenticationFailureHandler())
.and()
.authorizeRequests()
.antMatchers("List of URL").permitAll()
.anyRequest().authenticated()
.and()
.csrf()
.ignoringAntMatchers("List of API to ignore CSRF Token")
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
http.logout()
.permitAll()
.logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)));
}
@Autowired
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
Внешний интерфейс:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let newHeaders: HttpHeaders = req.headers;
let csrfToken = this.cookieService.get("XSRF-TOKEN");
if (csrfToken === null || csrfToken === undefined) {
newHeaders = newHeaders.append('X-XSRF-TOKEN', 'undefined');
} else {
newHeaders = newHeaders.append('X-XSRF-TOKEN', csrfToken);
}
const authReq = req.clone({headers: newHeaders, withCredentials: true});
return next.handle(authReq);
}
Кроме того, когда я смотрю на инструменты разработчика, я вижу три разных домена.
- home.com
- бэкэнд .home.com (XSRF cook ie находится только здесь и недоступен в других местах)
- frontend.home.com