Страница приветствия не загружается с помощью JWT

#javascript #jquery #spring-boot #extjs #jwt

#javascript #jquery #весенняя загрузка #extjs #jwt

Вопрос:

Я использую Spring Boot с ExtJS со страницей / login, которая представляет собой простой JSP с некоторым jQuery javascript. Я пытаюсь интегрировать JWT для защиты своих API-интерфейсов данных. Используя то, что я смог найти для реализации JWT, я внедрил JWTRequestFilter и удалил встроенный поток входа в систему из Spring Security.

Теперь моя форма входа в систему отправляет POST-запрос $ajax к методу /authenticate, который возвращает токен обратно в ответе. Когда я устанавливаю заголовок аутентификации в Postman вручную и запускаю запрос GET для страницы /welcome, я получаю действительный ответ…

В следующем коде я пытаюсь обновить заголовки с помощью токена и ПОЛУЧИТЬ страницу /welcome . Я получаю 401 ошибку, потому что заголовок аутентификации отсутствует, когда я пытаюсь получить доступ к странице с помощью этого кода…

 $form.on('submit', function(e) {
    e.preventDefault(); 
    $.ajax({  
      url: $form.attr('action'), 
      type: 'POST', 
      dataType: 'json', 
      contentType: 'application/json',
      data: JSON.stringify(dat), 
      success: function(result) {
  
        var d = new Date();
        d.setTime(d.getTime()   (3*24*60*60*1000));
        var expires = "expires="  d.toUTCString();
        
    //  $('head').append('<meta name="Authorization" content="Bearer '   result.token   '"');
        window.localStorage.setItem("Authorization", "Bearer "   result.token);
    //    document.cookie = "Authorization=Bearer " result.token   ";"   expires   ";path=/;httpOnly"; 
        window.location="/welcome";
}  error: funciton() {}
);
  

Я попытался поместить токен в файл cookie (который Tomcat9 игнорирует из-за формата). В настоящее время я рассматриваю эту проблему отдельно.

Я также попытался создать XMLHttpRequest() для страницы приветствия, которая возвращает мне необработанный HTML, но я не уверен, нужно ли мне каким-то образом перезагрузить DOM, используя этот ответ…

Каков наилучший способ взять токен авторизации в ответе и поместить его в заголовок для последующего /GET для страницы /welcome ?

Ответ №1:

Вы неправильно добавили заголовки. Чтобы добавить заголовки, вам нужно использовать beforeSend() :

 beforeSend: function (xhr) {
  xhr.setRequestHeader ("Authorization", "Bearer "   JWT);
},
  

Эту опцию необходимо отправить. Кроме того, JWT здесь означает JWT, токен и xhr является XMLHttpRequest необработанным объектом. Эта опция должна быть отправлена в параметр $.ajax() ‘s.

Комментарии:

1. Применяется ли это для всех запросов ajax и в противном случае? если я настрою объект XMLHttpRequest, будет ли заголовок по-прежнему применяться при попытке вызвать window. местоположение? ?

2. @ItGrunt Это повлияет только на конкретную вызывающую функцию AJAX, которой передается параметр. Для всех запросов вы также можете сделать это с помощью .ajaxStart() метода. Мой ответ затрагивает только конкретный запрос, о котором мы говорим. Не все остальное. Если вы используете window.location , это не вызов AJAX, а обычный запрос GET без каких-либо заголовков, так что нет.

3. Спасибо за ваш ответ… итак, можно ли использовать объект xhr для перезагрузки всей страницы, скриптов, css и всего остального? Я видел, как он использовался в прошлом только для загрузки данных из микросервисов в DOM

4. @ItGrunt Но в запросе GET обычно определенно невозможно отправлять заголовки аутентификации. Но с JavaScript, да, и что касается микросервисов, они используют специальный метод загрузки, я не уверен в названии, и я тоже видел этот способ. Но это невозможно в обычном запросе GET и определенно не используется window.location .