Я использую простой старый сервлет-фильтр для фильтрации всех запросов / ответов, которые приходят / выходят из моего сервера. Вот как выглядит мой метод doFilter:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)
request;
HttpServletResponse httpServletResponse = (HttpServletResponse)
response;
httpServletResponse.addHeader("Access-Control-Allow-Origin", ((HttpServletRequest) request).getHeader("Origin"));
httpServletResponse.addHeader("Vary", "Origin");
httpServletResponse.addHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE");
httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
httpServletResponse.addHeader("Content-Type", "application/json");
httpServletResponse.addHeader("Access-Control-Allow-Headers", " Set-Cookie, Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
try {
if (requiresAuth(httpServletRequest)) {
validateAuthentication(httpServletRequest);
validateAuthorization(httpServletRequest);
}
} catch (Exception e) {
writeErrorResponse(httpServletResponse, e);
return;
}
chain.doFilter(request, response);
}
Я регистрирую пользователя в конечной точке с именем /auth/v1/token
в контроллере REST пружины. Идея состоит в том, что, как только пользователь войдет в систему и успешно аутентифицируется, возьмите полученный JWT и установите его в качестве файла cookie для ответа с флагами HttpOnly
и Secure
, равными true. Затем этот файл cookie будет отправлен в ответ на мое веб-приложение, которое он может автоматически включать в каждый запрос обратно на мой сервер. Это показано ниже:
@RequestMapping(value = "/token", method = RequestMethod.POST)
public ResponseEntity<Jwt.Response> postToken(TokenBody body, HttpServletResponse response) throws UnirestException, IOException,
HttpUnauthorizedException {
Jwt.Response jwt = null;
try {
jwt = authService.loginHumanUser(body.getGroups(), body.getCode(), body.getRedirect_uri());
} catch (HttpUnauthorizedException e) {
throw new HttpUnauthorizedException("Failed to successfully authenticate with the application", e);
}
int expirationSeconds = Integer.valueOf(environment.getRequiredProperty("EXPIRATION_SECONDS"));
Cookie accessTokenCookie = new Cookie("access_token", jwt.getAccessToken());
accessTokenCookie.setDomain("dev-myapp.com");
accessTokenCookie.setHttpOnly(true);
accessTokenCookie.setMaxAge(expirationSeconds);
accessTokenCookie.setSecure(true);
accessTokenCookie.setPath("/");
response.addCookie(accessTokenCookie);
Cookie loggedInCookie = new Cookie("logged_in", "true");
loggedInCookie.setDomain("dev-myapp.com");
loggedInCookie.setSecure(true);
loggedInCookie.setMaxAge(expirationSeconds);
loggedInCookie.setPath("/");
response.addCookie(loggedInCookie);
return ResponseEntity.ok(jwt);
}
Вот в чем проблема: Из-за жизни я не могу получить заголовок Set-Cookie
для ответа на запрос от моего сервера на мое веб-приложение.
Мне бы хотелось несколько советов и идей, как решить эту проблему. Спасибо.