2015-02-07 18 views
5

Tôi đang phát triển một trang đơn với Javascript + AngularJS ở phía máy khách và Spring MVC + Spring Security OAuth2 ở phía máy chủ. Spring MVC hoạt động như một bộ điều khiển REST cho bất kỳ yêu cầu AJAX nào từ trang.Tải xuống tệp bằng Javascript với OAuth2

Để ủy quyền, tập lệnh gửi tiêu đề "Cấp quyền: Bearer ..." với mỗi yêu cầu AJAX. Điều này hoạt động tốt khi yêu cầu một lượng nhỏ dữ liệu. Để tải file XML (xuất khẩu dữ liệu người dùng) Tôi tải chúng qua AJAX, sử dụng các tiêu đề OAuth2 và tạo ra một Blob để cho phép lưu tập tin trong trình duyệt:

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(); 

Cách tiếp cận này hoạt động nhưng

  • sử dụng RAM và như vậy là không phù hợp cho tải tập tin lớn
  • không hiển thị một thanh tiến trình thích hợp/tải

vì vậy, câu hỏi là: có một đặt cược ter cách tải xuống tệp có ủy quyền OAuth2? Javascript không cho phép chỉ định tiêu đề khi thực hiện chuyển hướng và OAuth không cho phép chỉ định mã thông báo ủy quyền thông qua tham số URL. Tôi đang nghĩ đến việc một trong hai

  • thêm một Spring MVC phương pháp điều khiển đặc biệt để cung cấp một URL mà chuyển hướng từ một thẻ URL mã hóa với một yêu cầu HTTP header-mã hóa
  • bổ sung thêm một bộ lọc Xuân An để cho phép giải nén token từ URL thông số
  • chuyển sang uỷ quyền dựa trên cookie thay vì OAuth2

Nếu ai đã có vấn đề tương tự, bạn có thể vui lòng chia sẻ cách tiếp cận của bạn cho vấn đề này?

Trả lời

3

Hóa ra nó rất dễ dàng để đến vào mùa xuân-an ninh-OAuth2 2.0.7.RELEASE:

Đơn giản chỉ cần vượt qua thẻ truy cập như là tham số access_token yêu cầu:

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

Bây giờ, điều này sẽ xuất hiện với mã thông báo truy cập trong văn bản thuần túy trong lịch sử tải xuống, do đó, để bảo mật thích hợp, tùy chọn "đăng xuất" phải được triển khai đúng hoặc tải xuống sẽ phải được thực hiện dưới dạng "biểu mẫu bài đăng".

+0

rất hay để biết tính năng này. Một câu hỏi, bạn có ý nghĩa gì với "tùy chọn đăng xuất phải được triển khai đúng"? – dacuna

+5

URL sẽ được lưu giữ trong lịch sử của trình duyệt cùng với mã thông báo. Bất kỳ ai có quyền truy cập vào lịch sử của trình duyệt sẽ có thể tìm thấy URL và trích xuất giá trị access_token. Vì vậy, trong trường hợp người dùng đăng nhập từ một máy tính công cộng, anh ta cần có khả năng đăng xuất (phá hủy/quên access_token ở phía máy chủ), nếu không ai cũng có thể sử dụng access_token của mình cho đến khi nó hết hạn.Spring không cung cấp tính năng "đăng xuất", vì vậy trừ khi mã thông báo tồn tại trong thời gian ngắn, một tính năng cần được triển khai để xóa access_token ở phía máy chủ. –

+0

Aaam ok, cảm ơn vì bình luận của bạn! – dacuna

1

Tôi sẽ sử dụng cookie nếu tôi là bạn - nó sẽ làm mọi thứ phức tạp. Gần đây tôi đã viết một số blog để cho thấy nó dễ dàng như thế nào (ví dụ: https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii). Mọi người bị treo lên trên các ứng dụng "không quốc tịch".

+1

giải pháp của bạn để ngăn chặn xsrf trong tình huống này là gì? – Bon

+0

OAuth Security Security và Spring Security đều có tính năng chống xsrf (chúng tôi gọi nó là "csrf") được bật theo mặc định. Nếu bạn có một mối quan tâm đặc biệt, tôi sẽ nêu lên như một câu hỏi riêng biệt. –

+0

Nhưng nếu cookie đến từ một nguồn bên ngoài, làm cách nào bạn cung cấp mã thông báo để phòng ngừa xsrf là ​​những gì tôi tò mò. – Bon

Các vấn đề liên quan