Tôi có nên lưu trữ khiếu nại người dùng của mình trong mã thông báo JWT không?


18

Tôi đang sử dụng mã thông báo JWT trong các tiêu đề HTTP để xác thực các yêu cầu đến máy chủ tài nguyên. Máy chủ tài nguyên và máy chủ xác thực là hai vai trò worker riêng biệt trên Azure.

Tôi không thể trang điểm cho mình liệu tôi có nên lưu trữ các khiếu nại trong mã thông báo hoặc đính kèm chúng với yêu cầu / phản hồi theo cách khác hay không. Danh sách Khiếu nại ảnh hưởng đến việc hiển thị các thành phần UI phía máy khách cũng như quyền truy cập vào dữ liệu trên máy chủ. Vì lý do này, tôi muốn đảm bảo rằng các khiếu nại mà máy chủ nhận được là xác thực và được xác thực trước khi yêu cầu được xử lý.

Ví dụ về các khiếu nại là: CanEdit SẢNtList, CanEditShopDes mô tả, CanReadUserDetails.

Những lý do tôi muốn sử dụng mã thông báo JWT cho họ là:

  • Bảo vệ tốt hơn chống lại việc chỉnh sửa khiếu nại phía khách hàng (ví dụ như danh sách khiếu nại hack).
  • Không cần phải tra cứu các yêu cầu trên mỗi yêu cầu.

Những lý do tôi không muốn sử dụng mã thông báo JWT:

  • Sau đó, máy chủ auth phải biết danh sách yêu cầu tập trung vào ứng dụng.
  • Mã thông báo trở thành một điểm duy nhất của hack-entry.
  • Tôi đã đọc một số điều nói rằng mã thông báo JWT không dành cho dữ liệu cấp ứng dụng.

Dường như với tôi rằng cả hai đều có nhược điểm, nhưng tôi đang nghiêng về việc đưa các yêu cầu này vào mã thông báo và chỉ muốn chạy nó bởi những người đã xử lý vấn đề này trước đây.

LƯU Ý: Tôi sẽ sử dụng HTTPS cho tất cả các yêu cầu API, do đó, dường như với tôi rằng mã thông báo sẽ an toàn 'đủ'. Tôi đang sử dụng AngularJS, C #, Web API 2 và MVC5.


đọc nó ngay bây giờ .... và muốn cập nhật nếu bạn có thể. Tôi sẽ quan tâm đến những gì bạn đã làm, vì tôi đang phải đối mặt như vậy .. suy nghĩ và tôi đang thiếu làm thế nào một số phần được dự định để làm việc. người dùng nhận được mã thông báo ủy quyền, nhưng sau đó các yêu cầu được thực hiện như thế nào ... bạn có thể giải thích về phát hiện của mình không ... vì nó có thể sẽ giúp tôi.
Seabizkit

Câu trả lời:


7

Tôi chỉ lưu trữ các yêu cầu định danh (userid, v.v.) (được mã hóa) trong jwt của tôi.

Sau đó, khi tôi nhận được mã thông báo trên máy chủ (API), tôi có thể thực hiện phía máy chủ tra cứu (db hoặc cuộc gọi api mạng cục bộ) và truy xuất tất cả các liên kết đến userid (ứng dụng, vai trò, v.v.)

Tuy nhiên, nếu bạn muốn nhét nhiều hơn vào jwt, hãy cẩn thận với kích thước vì nó có thể sẽ được gửi theo từng yêu cầu, nhưng hãy đảm bảo mã hóa dữ liệu khiếu nại nhạy cảm.


Chúc mừng, DL. Bạn có lưu trữ các vai trò, v.v. trên máy chủ API không, hoặc chỉ cần nhấn DB hai lần mỗi khi bạn nhận được yêu cầu? (tức là một lần cho các vai trò và một lần cho dữ liệu thực tế được yêu cầu). Nếu bạn lưu trữ nó, tôi rất muốn biết bạn sử dụng phương pháp nào. Ngoài ra, bạn có nghĩa là bạn tiếp tục mã hóa người dùng 'bên trong' mã thông báo đã được mã hóa? Cảm ơn.
Astravagrant

1
Tôi chưa đi sâu vào triển khai của mình :), nhưng vâng, tôi đã nghĩ đến việc sử dụng máy chủ bộ đệm để theo cách đó tôi sẽ không truy cập db thường xuyên và nếu một vai trò thay đổi, bộ đệm có thể được gỡ bỏ để cho phép cái mới vai trò truy vấn được tải bộ nhớ cache đã lưu. Trong trường hợp của tôi, tôi có thể sẽ sử dụng elsticache Amazon AWS dựa trên memcached mở nhưng dễ cấu hình và sử dụng hơn.
wchoward

Tôi cũng nghĩ rằng nên lấy tất cả thông tin cần thiết trên máy chủ tài nguyên và không lưu trữ chúng trong mã thông báo.
Mateusz Migała

vì vậy, đối với mọi yêu cầu bạn nhận được vai trò của người dùng ... khiếu nại ..., bạn có thể chỉ cho tôi một bài viết hoặc một cái gì đó cho thấy điều này là khả thi. Hiện tại tôi đang sử dụng phiên, nhưng tìm kiếm một cách tốt hơn để làm mọi thứ, nhưng tìm kiếm mọi yêu cầu không cảm thấy đúng?
Seabizkit

3

Nghe có vẻ như xác thực (người dùng là ai) và ủy quyền (những gì người dùng được phép làm) không được phân chia rõ ràng như bạn muốn.

Nếu bạn không muốn máy chủ xác thực biết người dùng có quyền gì thì hãy giới hạn các khiếu nại trong JWT đó cho người dùng giống như wchoward đã đề xuất. Bạn có thể có một máy chủ khác được gọi là máy chủ ủy quyền tra cứu những gì người dùng được hưởng.

Bước ủy quyền có thể được thực hiện bởi máy chủ tài nguyên khi lần đầu tiên trình bày với mã thông báo xác thực của máy khách. Sau đó, máy chủ tài nguyên sẽ gửi mã thông báo đến máy khách chứa các khiếu nại ủy quyền.

Lưu ý: Cả hai JWT phải được ký bằng các khóa khác nhau.

Ưu điểm:

  • Xác thực và ủy quyền được quản lý riêng.
  • Máy chủ tài nguyên không phải tìm kiếm ủy quyền cho mỗi yêu cầu.
  • UI có quyền truy cập để xem ủy quyền nhưng không chỉnh sửa nó.

Con:

  • Khách hàng cần xử lý hai mã thông báo thay vì một.
  • Thêm một máy chủ ủy quyền thêm một phần di chuyển để quản lý.

1
Đừng quên rằng ngay cả khi bạn kiểm tra ủy quyền trong giao diện người dùng, bạn vẫn phải kiểm tra ủy quyền ở phía máy chủ khi có yêu cầu.
Chad Clark
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.