springsecurity: использование токена CSRF, полученного от сервиса CrossOrigin REST, для POST-данных - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть этот REST сервис на domainA:

@CrossOrigin(origins={"http://domainB"})
@RequestMapping(value="/csrf", method=RequestMethod.GET)
public @ResponseBody
CsrfToken getCsrfToken(HttpServletRequest request) {
    CsrfToken token = (CsrfToken)request.getAttribute(CsrfToken.class.getName());
    return token;
}

Затем я хочу получить токен CSRF из вышеуказанного сервиса (используя javascript на domainB) и добавить его к <form action="http://domainA> на domainB и отправить эту форму на domainA (это простая форма, которая имеет кнопка отправки).

Проблема в том, что я получаю HTTP-статус 403 - запрещено.

Как наоборот: когда я вручную устанавливаю значение _csrf (полученное вручную на другой вкладке браузера, указывающего на domainA/csrf) в <form action="http://domainA> и отправляю его, оно работает.

Разница, которую я заметил, заключается в том, что когда я вручную обновляю вкладку браузера domainA/csrf, тогда я получаю постоянно одно и то же значение (и это значение работает), но когда domainA/csrf получается с помощью javascript из domainB, это каждый раз отличается и при его использовании - не работает.

Может кто-нибудь помочь?


домен A: www.fridayweekend.com/rest/csrf

domainB: www.friwee.com/register (нажмите F12 и посмотрите, какой звонок на www.fridayweekend.com/rest/csrf вернется ....)

1 Ответ

0 голосов
/ 09 ноября 2018

Как сказал @dur - проблема была в коде JavaScript. Я использовал:

$.getJSON(domainA/csrf, callback)

, который заканчивался каждый раз новым сеансом и новым токеном CSRF для него.

Решением было использование функции cors_ajax_call, за исключением $.getJSON, определенной следующим образом:

var cors_ajax_call = function(address, callback){

  $.ajax({
      url: address,
      context: document.body,
      xhrFields: {
          withCredentials: true
      }
  }).success(callback);
}

Спасибо за ваш вклад! Надеюсь, это поможет кому-то:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...