2015-02-07 3 views
5

Я разрабатываю одностраничную страницу с Javascript + AngularJS на стороне клиента и Spring MVC + Spring Security OAuth2 на стороне сервера. Spring MVC действует как контроллер REST для любых запросов AJAX со страницы.Загрузка файлов в Javascript с помощью OAuth2

Для авторизации сценарий отправляет заголовки «Authorization: Bearer ...» с каждым запросом AJAX. Это прекрасно работает при запросе небольших объемов данных. Для загрузки XML-файлов (экспорт пользовательских данных) загрузить их с помощью AJAX, используя заголовки OAuth2 и создать Blob, чтобы сохранить файл в браузере:

var blob = new Blob([data.data], {'type': "text/xml"}); 
var a = document.createElement("a"); 
a.href = window.URL.createObjectURL(blob); 
a.download = "downloaded-file-" + new Date().toISOString() + ".xml"; 
a.click(); 

Этот подход работает, но

  • Использование оперативной памяти и поэтому не подходит для больших загрузок файлов
  • не показывает надлежащую прогресс/полосы загрузки

Итак, вопрос: есть ли ставка ter способ загрузки файлов с авторизацией OAuth2? Javascript не позволяет указывать заголовки при переадресации, а OAuth не позволяет указывать маркер авторизации через параметры URL. Я имею в виду либо

  • добавления специального метода контроллера Spring MVC, чтобы обеспечить URL, который перенаправляет из URL-закодирован маркеру для HTTP запроса
  • заголовка кодированного добавления дополнительного фильтра Spring Security для извлечения позволяет маркер из URL параметры
  • перехода к печенью на основе авторизации вместо OAuth2

Если кто-нибудь были подобные проблемы, не могли бы вы поделиться своим подходом к этой проблеме?

ответ

3

Оказывается, это очень легко в весенне-безопасности oauth2 2.0.7.RELEASE:

Просто передать маркер доступа в качестве параметра запроса access_token:

window.open("service/export?access_token=" + access_token); 

Теперь это будет выглядеть с токеном доступа в открытом тексте в истории загрузки, поэтому для обеспечения надлежащей безопасности параметр «выход из системы» должен быть правильно реализован или загрузка должна быть выполнена как «сообщение формы».

+0

приятно знать эту функцию. Один вопрос, что вы подразумеваете под «вариантом выхода из системы, должен быть правильно реализован»? – dacuna

+5

URL-адрес будет храниться в истории браузера вместе с токеном. Любой, кто имеет доступ к истории браузера, сможет найти URL-адрес и извлечь значение access_token. Поэтому, если пользователь входит в систему с общедоступного компьютера, он должен иметь возможность выйти из системы (уничтожить/забыть access_token на стороне сервера), иначе любой сможет использовать его access_token до истечения срока его действия.Spring не предлагает функцию выхода из системы, поэтому, если токены недолговечны, необходимо выполнить функцию, чтобы удалить access_token со стороны сервера. –

+0

Aaam ok, спасибо за ваш комментарий! – dacuna

1

Я бы пошел с печеньем, если бы был вами, это из-за этого все хлопот. Недавно я написал несколько блогов, чтобы показать, насколько это просто (например, https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii). Люди слишком зацикливаются на приложениях «без гражданства».

+1

Каково было бы ваше решение предотвратить xsrf в этой ситуации? – Bon

+0

Безопасность Spring и безопасность Spring OAuth имеют анти-xsrf (мы называем это «csrf») измерениями, которые включены по умолчанию. Если у вас есть особая озабоченность, я бы поднял это как отдельный вопрос. –

+0

Но если файл cookie поступает из внешнего источника, как вы предоставляете токен для предотвращения xsrf, мне интересно. – Bon

Смежные вопросы