Tôi đang thiết kế một dịch vụ web RESTful cần được người dùng truy cập, mà còn các ứng dụng và dịch vụ web khác. Tất cả các yêu cầu đến cần phải được xác thực. Tất cả các giao tiếp diễn ra trên HTTPS. Xác thực người dùng sẽ hoạt động dựa trên mã thông báo xác thực, có được bằng cách ĐĂNG tên người dùng và mật khẩu (qua kết nối SSL) với tài nguyên / phiên do dịch vụ cung cấp.
Trong trường hợp khách hàng sử dụng dịch vụ web, không có người dùng cuối đằng sau dịch vụ khách hàng. Các yêu cầu được bắt đầu bởi các tác vụ theo lịch trình, sự kiện hoặc một số thao tác máy tính khác. Danh sách các dịch vụ kết nối được biết trước (rõ ràng, tôi đoán vậy). Làm cách nào để xác thực những yêu cầu này đến từ các dịch vụ (web) khác? Tôi muốn quá trình xác thực dễ dàng nhất có thể để thực hiện cho các dịch vụ đó, nhưng không phải trả giá bằng bảo mật. Điều gì sẽ là tiêu chuẩn và thực tiễn tốt nhất cho một kịch bản như thế này?
Các tùy chọn mà tôi có thể nghĩ ra (hoặc đã được đề xuất cho tôi):
Yêu cầu các dịch vụ khách hàng sử dụng tên người dùng và mật khẩu "giả" và xác thực chúng giống như người dùng. Tôi không thích tùy chọn này - nó không cảm thấy đúng.
Chỉ định id ứng dụng vĩnh viễn cho dịch vụ khách hàng, có thể là khóa ứng dụng. Theo như tôi đã hiểu thì điều này cũng giống như có tên người dùng + mật khẩu. Với id và khóa này, tôi có thể xác thực từng yêu cầu hoặc tạo mã thông báo xác thực để xác thực các yêu cầu tiếp theo. Dù bằng cách nào, tôi không thích tùy chọn này, bởi vì bất kỳ ai có thể nắm giữ id ứng dụng và khóa đều có thể mạo danh khách hàng.
Tôi có thể thêm một kiểm tra địa chỉ IP vào tùy chọn trước đó. Điều này sẽ làm cho việc thực hiện các yêu cầu giả mạo trở nên khó khăn hơn.
Giấy chứng nhận khách hàng. Thiết lập quyền chứng chỉ của riêng tôi, tạo chứng chỉ gốc và tạo chứng chỉ ứng dụng khách cho các dịch vụ khách. Tuy nhiên, có một số vấn đề xuất hiện: a) làm thế nào để tôi vẫn cho phép người dùng xác thực mà không cần chứng chỉ và b) kịch bản này phức tạp đến mức nào khi thực hiện theo quan điểm dịch vụ khách hàng?
Một cái gì đó khác - phải có giải pháp khác ngoài đó?
Dịch vụ của tôi sẽ chạy trên Java, nhưng tôi cố tình bỏ qua thông tin về việc xây dựng khung cụ thể nào, bởi vì tôi quan tâm nhiều hơn đến các nguyên tắc cơ bản và không quan tâm nhiều đến các chi tiết triển khai - Tôi giả sử giải pháp tốt nhất cho việc này sẽ có thể thực hiện bất kể khuôn khổ cơ bản. Tuy nhiên, tôi hơi thiếu kinh nghiệm với chủ đề này, vì vậy những lời khuyên và ví dụ cụ thể về việc triển khai thực tế (như thư viện, bài viết hữu ích của bên thứ ba, v.v.) cũng sẽ được đánh giá cao.