Java - Cookie не устанавливается в REST-контроллере при использовании Servlet Filter Chain - PullRequest
0 голосов
/ 29 марта 2019

Я использую простой старый сервлет-фильтр для фильтрации всех запросов / ответов, которые приходят / выходят из моего сервера. Вот как выглядит мой метод 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 для ответа на запрос от моего сервера на мое веб-приложение.

Мне бы хотелось несколько советов и идей, как решить эту проблему. Спасибо.

...