2014-04-25 32 views
5

Tôi biết điều này đã được hỏi vô số lần, nhưng không có câu trả lời nào tôi tìm thấy mô tả kết nối thực sự với chương trình phụ trợ.Cách tìm hiểu xem người dùng vẫn đăng nhập bằng xác thực dựa trên phiên không?

Tôi có một ứng dụng JS một trang giao tiếp với API phụ trợ nhỏ (Django). Tôi sử dụng xác thực dựa trên phiên. Thông tin người dùng được lưu trữ trong lần tải đầu tiên. Nếu phiên hết hạn, tôi cần thay đổi tiêu đề trang và xóa thông tin người dùng khỏi bộ nhớ cache. Tuy nhiên, hầu hết các tài nguyên API của tôi là công khai và luôn trả về 200. Một số tài nguyên khác là riêng tư và trả lại 403 nếu người dùng không đăng nhập, điều này rất tuyệt vì điều này cho phép tôi giải thích thông tin tôi cần. Vấn đề là, một số trang chỉ truy cập tài nguyên công cộng. Trong trường hợp phiên bị đột nhiên bị xóa trên chương trình phụ trợ và người dùng điều hướng đến url chỉ truy cập tài nguyên công khai, thông tin người dùng không bị xóa và tôi gặp sự cố UX.

Ý tưởng ban đầu của tôi là yêu cầu tài nguyên người dùng riêng (hãy gọi nó là /users/self/) về mọi thay đổi url trả về 200 trong trường hợp người dùng được xác thực và 403 trong trường hợp không. Tuy nhiên, điều này yêu cầu thêm 1 yêu cầu trước mỗi yêu cầu khác cho mỗi thay đổi url, điều này không thực sự lý tưởng.

Có bất kỳ kỹ thuật nào dễ dàng hơn mà tôi có thể sử dụng trong trường hợp này không? Tôi không ngại ngay cả khi chuyển sang loại xác thực khác nếu điều đó có thể giải quyết được vấn đề.

Trả lời

2

Những gì tôi đã thực hiện và thấy trong các trường hợp như vậy là sử dụng một loại trình chặn chặn http chặn tất cả các yêu cầu http do Angular thực hiện và nếu phát hiện trạng thái phản hồi là 401, các kẻ chặn đó sẽ tăng sự kiện bằng cách sử dụng $rootScope.

Xem một thư viện ở đây https://github.com/witoldsz/angular-http-auth

Để sử dụng nó, người ta cần để đăng ký các sự kiện nâng cao sử dụng một số loại điều khiển gốc, có thể chuyển hướng người dùng đến trang đăng nhập.

Xem ví dụ ở đây https://medium.com/opinionated-angularjs/7bbf0346acec

+0

Vấn đề là hầu hết các câu trả lời đều công khai và luôn trả về 200. Sẽ không có ý nghĩa gì nếu chúng trả lại 403/401 nếu phiên hết hạn. –

+0

@ OndrejSlinták không trộn các tuyến đường trên máy chủ cần một phiên với các tuyến đường công khai mở. Điều đó sẽ tạo ra nhiều công việc hơn cho bạn sau này. – cgTag

+0

Những gì bạn đang nói, là phản ứng công cộng phụ thuộc vào một số tài nguyên bị hạn chế có nghĩa là bản thân họ nên bị hạn chế hoặc truy cập vào tài nguyên bị hạn chế một cách nào đó gây ra chuyển hướng xác thực khi truy cập. – Chandermani

1

Thay vì gửi một yêu cầu auth bổ sung, chỉ cần kiểm tra trong phần quản trị của bạn trong tất cả các yêu cầu, nếu phiên didnt hết hạn. Nếu người dùng không phải là auth, sau đó trả lại mã trạng thái.

Trong angularjs, chúng tôi đã sử dụng trình chặn chặn httpResponse, người chặn mọi phản hồi và kiểm tra mã trạng thái này.

+0

Tôi không thể làm điều này vì một số url yêu cầu tài nguyên công khai quay trở lại luôn luôn 200. Sẽ không có ý nghĩa gì nếu họ trả lại bất kỳ thứ gì khác. –

+0

nhưng nếu bạn không đăng nhập và yêu cầu tài nguyên, thì phải có phản ứng khác. –

1

Chúng tôi đang làm việc theo những gì người khác đã nói với bạn: sử dụng HttpInterceptor.

Chúng tôi có mọi phản hồi được gửi từ chương trình phụ trợ của chúng tôi theo cùng một cách: một đối tượng có hai trường: a responseCode và phản hồi thực tế. Chúng tôi thay đổi responseCode theo những gì đã xảy ra trong phần phụ trợ, thành công, cảnh báo bảo mật hoặc xác thực cần thiết cho hành động nhất định đó là các trường hợp phổ biến nhất.

Sau đó, trình chặn phản ứng theo cách thích hợp theo từng mã phản hồi mà chúng tôi đã xác định. Trong trường hợp yêu cầu xác thực, chúng tôi chuyển hướng đến trang đăng nhập, bạn có thể làm bất cứ điều gì bạn cần. Nó hoạt động rất tốt cho chúng tôi.

1

Phụ trợ của bạn có thể thêm tiêu đề vào phản hồi nếu người dùng vẫn đăng nhập, bất kể tài nguyên được yêu cầu có công khai hay không. Sau đó, khách hàng có thể kiểm tra sự hiện diện của tiêu đề đó và hành động tương ứng.

Trên cả hai mặt, điều này được thực hiện với một số loại bộ lọc hoặc bộ chặn. Trong góc này sẽ là $http interceptor.

+0

Tôi đã suy nghĩ về điều này, nhưng điều đó sẽ làm cho bộ nhớ đệm phản hồi bit khó hơn. Nhưng đó chỉ là trường hợp cụ thể của tôi. –

+0

@ OndrejSlinták Bạn có thể vui lòng giải thích về mối quan ngại của mình không? Tôi không thấy làm thế nào điều này có thể ảnh hưởng đến bộ nhớ đệm. – zeroflagL

+0

Trong trường hợp của tôi, tôi đang lưu vào bộ nhớ cache toàn bộ câu trả lời, bao gồm tiêu đề. Bằng cách này tôi sẽ phải thay đổi chúng trước khi gửi phản hồi. Nhưng đó vẫn là điều tôi đang cân nhắc. –

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