Каждый запрос заполняется WithCredentialsInterceptor
:
@Injectable()
export class WithCredentialsInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
withCredentials: true
});
return next.handle(request);
}
}
В задней части:
CORS
промежуточного программного обеспечения:
// process.env.CLIENT = https://www.example.com
this.router.options('*', cors({origin: process.env.CLIENT, credentials: true}));
this.router.use(cors({origin: process.env.CLIENT, credentials: true}));
// On valid Login:
res.cookie('SESSIONID', createdSession, {maxAge: someTime, httpOnly: true, secure: true});
res.cookie('XSRF-TOKEN', createdToken, {maxAge: someTime});
Вразработка: ng serve --ssl
Использование proxy.conf.json
и НЕ cors
- оба файла cookie были успешно установлены в видимой «корзине» (devtools -> application / storage -> cookie).
Удаление proxy.conf.json
в пользу CORS для имитации производственной архитектуры устанавливает только cookie XSRF, но SESSIONID
, помеченный secure
и httpOnly
, являетсяНЕ.Заголовки отправляются в этом случае только X-XSRF-TOKEN
(я предполагаю, что это ожидаемое поведение для поддельного HTTPS
dev-сервера).
Предполагается, что он будет работать должным образом внутри законногоHTTPS enviromnet, я приступил к работе со структурой.
Доменные имена следующие:
Проблема
ОБА куки неустановите в «банке печенья»
АЛЬТУХ: куки отображаются в заголовках ответов при успешном входе в систему:
Заголовки ответов:
set-cookie: XSRF-TOKEN=The-legit-XSRF-TOKEN; Max-Age=number; Path=/; Expires=Tue, 22 Oct 2019 18:56:31 GMT
set-cookie: SESSIONID=The-legit-SessionID-Token; Max-Age=number; Path=/; Expires=Tue, 22 Oct 2019 18:56:31 GMT; HttpOnly; Secure
И они также ОТПРАВЛЯЮТСЯ в следующем запросе:
Заголовки запроса
cookie: SESSIONID=The-legit-SessionID-Token; XSRF-TOKEN=The-legit-XSRF-TOKEN
Но XSRFInterceptor
НЕ захватывает файл cookie, который он должен, и не являетсяон доступен через document.cookie
, поэтому запрос НЕ отправляется с реализацией X-XSRF-TOKEN
.
XSRFInterceptor
:
@Injectable()
export class HttpXsrfInterceptor implements HttpInterceptor {
constructor(private tokenExtractor: HttpXsrfTokenExtractor) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Obse rvable<HttpEvent<any>> {
const HEADER_NAME = 'X-XSRF-TOKEN';
// let TOKEN = document.cookie.split('; ').find(cookie => cookie.startsWith('XSRF-TOKEN'));
let TOKEN = this.tokenExtractor.getToken() as string;
if (TOKEN && !req.headers.has(HEADER_NAME)) {
// TOKEN = TOKEN.split('=')[1];
req = req.clone({ headers: req.headers.append(HEADER_NAME, TOKEN) });
}
console.log(req) // <-- withCredentials: true
return next.handle(req);
}
}
В журналах сервера я получаю подтверждениеn файлы cookie приняты хорошо, но из-за того, что XSRFInterceptor
не удалось извлечь токен, промежуточное ПО сбивает мой запрос:
console.log(csrfCookie, csrfHeader); // The-legit-XSRF-TOKEN, undefined
console.log(csrfCookie === csrfHeader); // false
Мне удалось войти в систему, скопировав действительные SESSIONID
и XSRF-TOKEN
в банку с печеньем и при попытке выйти из системы - я заметил, что Angular также игнорирует DELETE cookie
заголовки, отправленные с сервера, так как меня постепенно переносили на страницу входа, хотя скопированные куки НЕ были удалены.
Кто-нибудь признает эту проблему?