2015-12-17 18 views
11

Ứng dụng web của tôi được tạo thành từ rất nhiều cuộc gọi Ajax đến phía máy chủ RESTful APIs. Mỗi lần khách hàng đăng nhập trang web của tôi, trang đăng nhập sẽ nhận được mã thông báo JWT (Mã thông báo Web JSON) từ máy chủ và lưu nó dưới dạng cookie ở phía máy khách. (Tôi chọn lưu trữ dưới dạng cookie vì đó là cách duy nhất để trình duyệt tự động gửi trình duyệt và được cho là an toàn hơn Lưu trữ web HTML5). Có một trường trong mã thông báo mô tả ngày hết hạn của mã thông báo. Đối với mỗi cuộc gọi Ajax, mã thông báo được gửi cùng để xác thực.Làm thế nào để xử lý một cách duyên dáng hết hạn đăng nhập cho một cuộc gọi Ajax?

Nếu khách hàng ở lại trên trang của tôi lâu, mã thông báo có thể hết hạn. Và máy chủ sẽ phát hiện nó khi máy khách thực hiện yêu cầu HTTP tiếp theo (không chỉ gọi REST). Tôi sử dụng số servlet filter để chặn các yêu cầu HTTP all và kiểm tra mã thông báo hết hạn. Nếu mã thông báo hết hạn, một phản hồi chuyển hướng đến trang đăng nhập sẽ được gửi.

Nhưng có một vấn đề về cách tiếp cận trên: "Cách xử lý một cách duyên dáng chuyển hướng tới trang đăng nhập phản hồi ở phía khách hàng?"

  • Đối non-Ajax có nguồn gốc yêu cầu HTTP, tôi có thể dựa trên trình duyệt để xử lý các phản ứng chuyển hướng để đăng nhập trang và làm cho trang nhảy tự động.

  • Đối Ajax có nguồn gốc yêu cầu HTTP, có vẻ như tôi cần phải bổ sung thêm logic để each ajax gọi của completion handler để phát hiện các phản ứng chuyển hướng để đăng nhập trang và imperatively thực hiện chuyển trang.

Hoặc tôi hoàn toàn sai?

Một số refs:

JWT (JSON Web Token) automatic prolongation of expiration

Which authentication strategy should I use for my API?

Implicit & Explicit authentication

ADD 1:

Dường như trình duyệt sẽ xử lý 302 redire ction minh bạch. Vì vậy, có lẽ tôi chỉ có thể trả lại chuyển hướng 302 đến trang đăng nhập, có thể là cuộc gọi ajax hoặc truy cập trang đơn giản. Tôi sẽ cố gắng và trả lời sau.

Từ here:

Nếu câu trả lời là một chuyển hướng HTTP (mã trạng thái 301, 302, 303 hoặc 307), sau đó nó phải được tuân thủ một cách minh bạch (trừ khi nó vi phạm an ninh hoặc biện pháp phòng ngừa vòng lặp vô hạn) . Bất kỳ lỗi nào khác (bao gồm 401) PHẢI khiến đối tượng sử dụng trang lỗi đó làm phản hồi.

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

Trả lời

2

Yeah, tôi nghĩ rằng bạn là đúng.

Đối với không phải là ajax, bạn có thể xử lý nó trong đầu phục vụ bằng cách sử dụng chuyển hướng.

Đối với ajax, bạn có thể chuyển trang tùy thuộc vào kết quả ajax.

9

Vì lý do chính xác này, API web không được trả lời với 302 redirect, nhưng với 401 unauthorized khi mã thông báo hết hạn.

Ứng dụng web phải trả về 302 câu trả lời vì chúng luôn có nghĩa là được sử dụng bởi trình duyệt như đại lý. Để biết thêm thông tin, xem thêm my answer here.

+0

hmm, tôi không biết điều này cho đến bây giờ. Dường như có một "quy ước HTTP" để làm theo. Cảm ơn nhiều! – smwikipedia

+1

BTW, đây không phải là để nói rằng một API web không bao giờ nên trả lại một phản ứng 302. Nếu tài nguyên thực sự di chuyển, thì hoàn toàn tốt để trả lại 301 hoặc 302. Nhưng nó không nên được sử dụng để triển khai cơ chế xác thực cho API web IMO. – MvdD

+0

Có. * Biểu mẫu theo chức năng *. – smwikipedia

2

Chuyển hướng 302 sẽ không hoạt động đối với cuộc gọi javascript (ajax), nó sẽ chỉ gọi trang mới từ bên trong javascript chứ không phải trình duyệt thực.

Giải pháp gọn gàng là trả lại đối tượng json bằng thông báo lỗi và hiển thị thông báo lỗi đó. hoặc sau đó sử dụng javascript để thay đổi vị trí thành trang đăng nhập

1

Bạn có thể sử dụng một số Global Ajax Event Handler để xử lý hết hạn phiên.

Cố gắng bắt số .ajaxError() và sau đó kiểm tra xem phiên của nó hết hạn hay cái gì khác và hoạt động tương ứng.

Tôi chưa thử cách này thành thật, nhưng đáng để chụp.

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