Tôi đang trong quá trình thiết kế 3 thành phần sẽ hoạt động trong giao hưởng với nhau:
- Một dịch vụ web RESTful yêu cầu
BasicAuth
qua HTTPS trên tất cả các cuộc gọi và đó là những gì thực sự làm tất cả các công việc nặng nề cho hệ thống của tôi (thực hiện công việc) - Giao diện người dùng web chuyển các hành động của người dùng cuối thành các lệnh gọi API sang dịch vụ web được đề cập ở trên; do đó UI được "hỗ trợ bởi" WS
- Một công cụ giao diện dòng lệnh (CLI) mà các nhà phát triển có thể cài đặt và chạy cục bộ, cũng dịch các lệnh thành các lệnh gọi API đến WS (do đó nó cũng được "hỗ trợ bởi" WS)
Một trong những rào cản đầu tiên tôi đang cố gắng vượt qua là liên quan đến xác thực và ủy quyền.
Hãy giả vờ rằng WS sử dụng dịch vụ thư mục LDAP / (như AD hoặc có lẽ là Apache DS) làm lãnh vực xác thực của nó. Có nghĩa là, khi một cuộc gọi API đến qua mạng (giả sử, HTTPS GET
đối với một số tài nguyên), BasicAuth
thông tin đăng nhập được trích xuất từ yêu cầu và được chuyển tiếp đến dịch vụ LDAP để xác định xem đây có phải là người dùng hợp lệ hay không. Nếu chúng được xác thực, thì hãy nói rằng một lĩnh vực ủy quyền riêng biệt, có lẽ là cơ sở dữ liệu, được sử dụng để xác định liệu người dùng được xác định có thể thực hiện những gì họ đang cố gắng trong yêu cầu HTTPS hay không. Càng xa càng tốt.
Trong trường hợp công cụ CLI, người dùng sẽ phải xác thực trước khi chạy bất kỳ lệnh nào và do đó mô hình này hoạt động tốt, vì một người dùng sẽ chỉ vận hành cùng một thể hiện CLI tại một thời điểm nhất định.
Vấn đề xảy ra khi chúng tôi thử tích hợp ứng dụng web (UI) với WS, bởi vì nhiều người có thể đăng nhập vào ứng dụng cùng một lúc, tất cả đều có các quyền khác nhau cho phép các lệnh gọi API cơ bản mà họ được phép thực hiện.
Theo như tôi thấy, có vẻ như tôi có nhưng 4 tùy chọn ở đây:
- Thông tin đăng nhập lưu trữ : Sau khi đăng nhập vào ứng dụng, các thông tin được bằng cách nào đó, ở đâu đó lưu trữ (như vậy mà các ứng dụng này có quyền truy cập vào chúng), và các ứng dụng không thực thi bất kỳ loại chính sách quyền riêng của mình. Khi người dùng cố gắng thực hiện những việc tạo ra các lệnh gọi API trong phần mềm, thông tin đăng nhập của họ được tra cứu từ bộ đệm và được chuyển tiếp bằng các lệnh gọi API. Nếu WS xác định họ không được ủy quyền, nó sẽ gửi lại lỗi.
- Tài khoản cấp dịch vụ : Cả ứng dụng và WS đều sử dụng cùng một lĩnh vực xác thực / ủy quyền, ngoại trừ giao diện người dùng web hiện thực thi ủy quyền đối với những gì người dùng thực sự có thể nhìn thấy và làm trong ứng dụng. Nếu họ được phép thực hiện điều gì đó tạo cuộc gọi API cơ bản, ứng dụng sẽ gửi thông tin đăng nhập tài khoản dịch vụ (ví dụ
myapp-admin-user
) với mỗi cuộc gọi API thay mặt cho người dùng. - OAuthv2 : Tôi không biết OAuth là gì hoặc nếu nó áp dụng cho kịch bản này, nhưng cảm thấy nó có thể là một giải pháp ở đây bằng cách nào đó.
- Máy chủ mã thông báo: Sử dụng máy chủ mã thông báo như CAS hoặc có thể là Kerberos để xác nhận cho người dùng, theo cách tương tự như tùy chọn Tài khoản cấp dịch vụ hoạt động. Tại đây, khi người dùng đăng nhập vào ứng dụng thành công, máy chủ mã thông báo sẽ gửi lại ứng dụng UUID phiên và cũng đăng ký UUID đó với WS. Mỗi khi ứng dụng tạo lệnh gọi API, nó sẽ xử lý UUID theo yêu cầu, sau đó xác nhận hợp lệ ở phía WS.
Các " Credentials Cached " tùy chọn chỉ cảm thấy giống như một thác loạn của tất cả những gì là tốt và lành mạnh trong an ninh-đất. Nó chỉ cảm thấy sai để thông tin bộ nhớ cache bất cứ nơi nào, bao giờ.
Các " token server " tùy chọn dường như hợp lệ cho một loại thiết lập SSO, nhưng không phải trong trường hợp cụ thể này và cảm thấy lúng túng với tôi. Tôi cũng nghĩ rằng không có cách nào tốt để sử dụng khái niệm UUID phiên và BasicAuth
/ HTTPS cùng một lúc.
Vì vậy, điều này để lại OAuthv2, mà tôi không biết gì và " Tài khoản cấp dịch vụ (SLA) * " là các tùy chọn duy nhất còn lại. Tùy chọn SLA có vẻ ổn, nhưng có một vài nhược điểm sau:
- Nó đòi hỏi tài khoản dịch vụ về cơ bản phải có "đặc quyền của chúa" đối với WS. Nói cách khác, một khi ứng dụng cho rằng người dùng được phép nhấp vào nút hoặc làm điều gì đó trong Giao diện người dùng, điều đó chuyển thành lệnh gọi API vô điều kiện bởi tài khoản dịch vụ đang được UI sử dụng. Điều này chỉ cảm thấy xấu, mkay?
- Tôi nhận thấy rằng việc duy trì hai bộ quyền (bộ quyền cho mỗi người dùng ứng dụng và sau đó bộ quyền cho tài khoản dịch vụ được ứng dụng sử dụng đối với WS) có thể dẫn đến việc các quyền thoát khỏi đồng bộ với nhau bằng cách nào đó
Vì vậy, có vẻ như tôi không thực sự có bất kỳ lựa chọn tốt ở đây. Chắc chắn tôi không thể là nhà phát triển đầu tiên gặp phải vấn đề này, nhưng việc hỏi Google Gods đã không giúp tôi nhiều ở đây. Có ý kiến gì không?