Я получил следующую реализацию oauth2:

  1. Мой интерфейс (SPA), написанный на angular2, обслуживается с frontend.mydomain.com.
  2. Когда пользователь входит в систему, он подключается к auth.mydomain.com, серверная часть отвечает токеном доступа и устанавливает httpOnly cookie, содержащий токен обновления.

Вот как я устанавливаю cookie:

@RequestMapping(path="/retrieve", method = RequestMethod.GET)
public String getToken(HttpServletResponse resp, @RequestParam("username") String username, @RequestParam("password") String password) {
    String[] tokens = //retrieve tokens logic, values are not important

    Cookie cookie = new Cookie("token", tokens[1]);
    resp.addCookie(cookie);

    return tokens[2];
}
  1. Данные извлекаются из resources.mydomain.com (запросы отправляются с токеном доступа)
  2. когда токен истекает, я хочу обновить его, отправив запрос на auth.mydomain.com - сервер должен получить токен обновления из cookie и ответить новым токеном доступа.

Я думаю, что у меня проблема в пункте 2, который влияет на пункт 4 - cookie не отправляется. org.springframework.web.bind.ServletRequestBindingException: Missing cookie 'token' for method parameter of type Object

Почему? Что я могу сделать, чтобы браузер сохранял и отправлял этот файл cookie?

Когда я заглядываю в свой браузер (инструменты разработчика), я вижу, что ответ на отдых отправляет cookie: введите описание изображения здесь

Но в браузере не хранятся файлы cookie: введите здесь описание изображения

1
Maciej Treder 10 Янв 2017 в 15:24
1
Поскольку файл cookie, по-видимому, уже отправлен правильно, это, вероятно, вообще не вопрос Spring. Я предполагаю, что это проблема с вашим кодом Angular (на шаге 4) - вы устанавливаете " withCredentials "RequestOption при выполнении запроса на обновление?
 – 
Henning
10 Янв 2017 в 21:46
Нет, я не Нужно ли мне?
 – 
Maciej Treder
10 Янв 2017 в 22:13
Я соответственно изменил свой код: this.http.post (AUTHENTICATION_ENDPOINT + "/ refresh", new RequestOptions ({withCredentials: true})) все еще та же проблема
 – 
Maciej Treder
10 Янв 2017 в 22:42

1 ответ

Лучший ответ

Проблема была во внешней стороне. Я не использовал опцию withCredentials. Его также следует использовать для запроса, который устанавливает cookie, и для запроса, который отправляет cookie:

Получение cookie:

this.http.get(
    AUTHENTICATION_ENDPOINT + "/retrieve?username=" + login + "&password=" + password + "&remember=" + remember, 
    new RequestOptions({withCredentials: true})
)

Отправка cookie:

this.http.get(
     AUTHENTICATION_ENDPOINT + "/refresh", 
     new RequestOptions({withCredentials: true})
)
1
Maciej Treder 11 Янв 2017 в 12:13