Я отправляю запрос GET для обычной проверки подлинности, на который сервер (бэкэнд-API) возвращает (в случае успешной проверки подлинности) файл cookie.Это работает нормально для POSTMAN, но в браузере не устанавливается cookie.
@GetMapping("/login")
@ResponseStatus(value=HttpStatus.OK)
public void loginUser( final HttpServletRequest request ,final HttpServletResponse response) throws UnsupportedEncodingException {
setAuthCookieToResonse(request,response);
}
private void setAuthCookieToResonse(final HttpServletRequest request ,final HttpServletResponse response) throws UnsupportedEncodingException {
logger.debug("Adding cookie after authentication");
String cookieKey = "auth";
String cookieValue = request.getHeader("Authorization");
if (cookieValue != null) {
Cookie cookie = new Cookie(cookieKey, URLEncoder.encode(cookieValue, "utf-8"));
cookie.setHttpOnly(true);
cookie.setDomain("localhost");
response.addCookie(cookie);
}
}
Вот мой поток приложений:
- Вход в браузер / POSTMAN с использованием обычной аутентификации.Отправьте учетные данные, используя заголовок
Authorization Basic xxxxxx==
. - Сервер считывает данные проверки подлинности, и, если он правильный, он создает файл cookie с именем
auth
и отправляет его обратно с ответом (код выше).Для уровня безопасности я использую Spring security. - Для дальнейших запросов этот cookie будет автоматически отправляться с каждым запросом.Теперь мне нужно было взять этот cookie и извлечь из него детали аутентификации.После этого мне пришлось добавить
Authorization Basic xxxxxx==
к этому запросу (потому что теперь Authorization
не отправляется клиентом, отправляются только cookie).Для этого я создал Filter
, который будет работать до BasicAuthenticationFilter.class
Spring. Шаг 2 работает для POSTMAN, но не для браузера.В POSTMAN отправленный сервер response
содержит Set-Cookie →auth=Basic xxxxxxxx=; Domain=localhost; HttpOnly
.
curl -i -u pu@gmail.com:password@ http://localhost:8085/api/v1/login
HTTP/1.1 200
Set-Cookie: auth=Basic xxxxxxxx==; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 0
Date: Tue, 12 Feb 2019 05:59:33 GMT
Заголовок ответа в браузере:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3007
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Tue, 12 Feb 2019 11:52:10 GMT
Expires: 0
Pragma: no-cache
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Какую дополнительную конфигурацию мне нужно сделать здесь?