2013-04-27 31 views
11

Tôi hiện đang triển khai Kiến trúc OAuth 2.0 cho API RESTful của mình.Kiểm tra mã thông báo truy cập mỗi yêu cầu với Redis

Với mỗi yêu cầu, tôi thiết lập Mã thông báo người gửi ủy quyền trong Tiêu đề HTTP cho tất cả khách hàng của tôi để thực hiện Yêu cầu được ủy quyền.

Authorization: Bearer sdflksd3r4823vkn95-03850432 

Tôi hiểu rằng thực tế phổ biến là chỉ chấp nhận mã thông báo trong API cho đến ngày hết hạn. Nhưng giả sử nếu người dùng muốn thu hồi mã thông báo, tôi sẽ cần sử dụng phương pháp kiểm tra trạng thái mã thông báo với mỗi yêu cầu.

Vì vậy, tôi đã nghĩ đến việc chuyển sang Db để kiểm tra mọi yêu cầu HTTP. Tôi có một cảm giác rằng điều này sẽ không quy mô độc đáo do lý do hiệu suất.

Vì vậy, tôi đã tự hỏi nếu một giải pháp như Redis sẽ là thích hợp cho lần đọc rất nhanh của trạng thái mã thông báo truy cập?

Trả lời

9

Điểm có HMAC cho mã thông báo là máy chủ có thể xác minh nhanh chóng mà không cần gọi đến bất kỳ kho dữ liệu ngoài nào (ví dụ Redis, MySQL, v.v.). Điều này có thêm lợi ích của việc mở rộng quy mô độc đáo cho nhiều máy chủ vì không có trạng thái chia sẻ (tất cả thông tin để xác minh mã thông báo là mã thông báo và khóa cho HMAC).

Nếu bạn sắp có danh sách đen các mã thông báo bị thu hồi thì một số thứ như Redis có thể sẽ ổn (mặc dù vẫn chậm hơn là không thực hiện cuộc gọi từ xa cho mỗi xác minh mã thông báo). Thiết lập đúng cách, với độ trễ thấp giữa phiên bản Redis và (các) máy chủ API của bạn, bạn sẽ thấy < 10ms theo yêu cầu.

Phần thưởng: Một tùy chọn khác để tăng tốc độ hơn nữa sẽ là sử dụng Bloom filter để xử lý bộ nhớ đệm của các yêu cầu API bị từ chối. Bằng cách đó bạn chỉ cần truy cập Redis nếu bộ lọc Bloom gắn cờ mã thông báo yêu cầu có thể bị thu hồi. Lưu ý rằng vì đây là một lớp bộ nhớ đệm khác, bạn sẽ phải cập nhật trạng thái của bộ lọc Bloom khi mã thông báo bị từ chối.

+0

Tôi chắc chắn đang xem xét bộ lọc nở hoa. Mặc dù tôi cũng tự hỏi nếu nó sử dụng một bộ nhớ đệm đơn là một lựa chọn khả thi –

+1

Nếu bạn chỉ có một máy chủ duy nhất thì bạn có nhiều tùy chọn hơn vì bạn chỉ phải duy trì trạng thái ở một nơi duy nhất. Có một máy chủ bên ngoài như Redis duy trì trạng thái cho phép bạn có nhiều máy chủ API. Một singleton chỉ hoạt động nếu bạn có một máy chủ duy nhất. Một lựa chọn khác sẽ là Bản đồ phân tán (Coherence, Hazelcast, v.v.). Nếu các thẻ có thời gian hết hạn tương đối ngắn thì bạn cũng có thể xóa sau đó khỏi bản đồ được phân phối khi chúng hết hạn để giảm kích thước của nó. – sehrope

+0

Câu trả lời hay. Cảm ơn rất nhiều! –

2

Tôi đang làm một cái gì đó tương tự cho bản thân mình.
Đối với cú pháp và mã hóa mã thông báo, tôi khuyên bạn nên sử dụng JWT, đây là tiêu chuẩn tốt cho điều đó.
Bạn có thể sử dụng redis để lưu trữ mã thông báo cặp/userid, cũng vì chúng tôi có thể đặt giá trị hết hạn.
Ngoài ra tôi đã chèn một bộ lọc hoa ở giữa, nhưng tôi đã làm nó theo cách ngược lại so với gợi ý sehrope: Tôi lưu trữ tất cả các thẻ khi đăng nhập bằng bộ lọc nở, vì vậy nếu mã thông báo không hiện diện thì chắc chắn không hợp lệ ; khác có lẽ là chính xác nhưng tôi phải kiểm tra Redis để chắc chắn; nhưng bây giờ tôi có một vấn đề: nếu tôi muốn mở rộng hệ thống auth của tôi, tôi cần một cân bằng tải trạng thái giữa các máy chủ auth. IMHO, sử dụng bộ lọc nở để tạo danh sách đen không chính xác: nếu tôi liệt kê danh sách đen trong bộ lọc hoa bị thu hồi và mã thông báo sai, nếu mục không được đưa vào danh sách đen, bộ lọc nở sẽ trả về false (và tôi phải kiểm tra nó trong phần phụ trợ của redis) để xác thực); khác nếu một phần tử là hiện tại (danh sách đen) Tôi phải kiểm tra nó trên redis để chắc chắn vì bộ lọc nở phản ứng đúng có thể là một dương tính giả.

+0

Tôi thực sự đang sử dụng Mã thông báo JWT trên trang AngularJS của tôi được lưu trữ trong sessionStorage.They sẽ phải đăng nhập mỗi khi ứng dụng trình duyệt bị đóng. Đây cũng là thời gian hết hạn 30 phút trước khi người dùng sẽ phải được phát hành lại một mã thông báo khác. Tôi chỉ đơn giản là sử dụng redis để ghi lại nó, và nó cho phép tôi tìm các thẻ rất nhanh. –

6

Tôi đã triển khai một cái gì đó tương tự để xử lý mã thông báo bị thu hồi do JWT tạo.

Tôi đang sử dụng redis để đặt mã thông báo bị thu hồi với thời gian hết hạn, do đó mã thông báo sẽ tự động bị xóa khỏi lỗi. Và tôi có một phần mềm trung gian để kiểm tra lại mã thông báo đã cung cấp. Kiểm tra full post here.Hy vọng nó sẽ giúp

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