2017-06-17 15 views
6

Chúng tôi có kiến ​​trúc dịch vụ vi mô và chúng tôi đang thảo luận một số cách để hiển thị lỗi nội bộ cho khách hàng.Thực hành tốt để truyền bá lỗi thông qua các dịch vụ vi mô

Dưới đây là một ví dụ:

Giả sử chúng ta có 3 dịch vụ, dịch vụ A, B và C. Khi client gửi một yêu cầu đến dịch vụ A, đó là công cộng, dịch vụ này sẽ gửi một yêu cầu để phục vụ B gửi yêu cầu tới dịch vụ C (là xác thực nội bộ và nhu cầu, nhưng thông tin đăng nhập được lưu trữ nội bộ như biến môi trường, chúng không được gửi bởi máy khách).

Và vì lý do nào đó, giao tiếp giữa B và C nhận được 401 (có thể là 422, 403 hoặc bất kỳ lỗi nào liên quan đến khách hàng), có nghĩa là yêu cầu không được ủy quyền.

Something như thế: enter image description here

Các thông tin liên lạc giữa B và C là nội bộ, người dùng không biết về các dịch vụ này. Tôi có nên để lộ cấu trúc bên trong của mình gửi 401 cho khách hàng không? Do đó không phải lỗi của khách hàng? Tôi có nên gửi 500?

+1

Nếu đó không phải lỗi của người dùng, thì 5xx là phạm vi mã phản hồi chính xác. –

+0

@OliverCharlesworth Tôi đồng ý với bạn, Và tôi có nên đăng nhập lỗi này nội bộ và không để lộ bất kỳ thông tin nào cho người dùng không? bạn nghĩ sao? –

+2

Nó phụ thuộc. Nhưng thường được coi là xấu để hiển thị chi tiết lỗi nội bộ (như dấu vết ngăn xếp) cho người dùng (cả từ UX và quan điểm bảo mật). Ít nhất, một số thông báo như "Lỗi máy chủ 500 - ID lỗi duy nhất của bạn là 123456" cho phép bạn tương quan người dùng với ID trong nhật ký lỗi của bạn sau này. –

Trả lời

7

Tốt hơn là tránh để lộ 500 trạng thái một cách rõ ràng nhưng trong một số trường hợp cần thiết. Một người dùng làm việc với hệ thống của bạn không phải với dịch vụ cụ thể và cho anh ta nó không quan trọng những gì bên trong. Triển khai hệ thống nội bộ có thể thay đổi nhưng tương tác của người dùng có thể giữ nguyên.

Ví dụ: A sẽ là dịch vụ thương mại điện tử, dịch vụ thanh toán B và cổng thanh toán C. Người dùng mua sản phẩm qua A gửi yêu cầu thanh toán tới B và B liên lạc với C để thực hiện giao dịch. 401 giữa B và C có thể vì nhiều lý do khác nhau. Nếu nó chỉ đơn giản là vấn đề cấu hình nội bộ (không được cập nhật mật khẩu, giấy chứng nhận hết hạn và vv) thì đó là lỗi hệ thống nội bộ và bạn cần thông báo cho người dùng biết rằng dịch vụ hiện không khả dụng hoặc tương tự, không vượt qua tất cả chi tiết lỗi nội bộ. Bạn có thể sử dụng mã 5xx trong trường hợp này. Có lẽ dịch vụ B có thể yêu cầu một số loại hàng đợi và nói với dịch vụ A đó là mọi thứ đều ổn, yêu cầu của bạn sẽ được xử lý sau. Nhưng nếu đó là do người dùng cố gắng sử dụng thẻ tín dụng xấu hoặc không có đủ tiền (không yêu cầu được ủy quyền) A cần hiển thị thông báo thích hợp và mã phản hồi 4xx.

Nói chung một dịch vụ sẽ tiết lộ tài nguyên và không quan trọng có bao nhiêu dịch vụ nội bộ hoặc bên ngoài, cơ sở dữ liệu, nguồn dữ liệu vv. Có lẽ 401 giữa B và C có nghĩa là cho B đi đến dịch vụ D (C thay thế) và A dịch vụ không nên biết về 401 ở tất cả. Vì vậy, nó phụ thuộc vào những gì bạn cần để tiếp xúc với người dùng và cách bạn cần để xử lý các trường hợp khác nhau.

2

Biểu đồ của bạn có ý nghĩa rất ít. Cuộc gọi đến không phải là 200 cho đến khi nó trở lại thành công, sau khi tất cả các dịch vụ nội bộ được gọi.

Nếu xác thực giữa B và C là nội bộ (máy chủ đến máy chủ auth), thì bạn có lỗi nội bộ và 502 là lựa chọn lành mạnh để quay trở lại A. Tất nhiên, bạn có thể quyết định thử lại trong máy chủ A, khi bạn nhận được 502 từ B, nhưng nó là vô nghĩa vì đó là một mã thông báo hết hạn. Vì vậy, bạn có thể quyết định như chính sách mà 401 nội bộ nên được leo thang trở lại A. Hoặc bạn có thể tìm thấy đính kèm siêu dữ liệu trong cơ thể phản ứng lỗi 502 hỗ trợ một cơ chế thử lại. Dù sao, auth server-server không nên thất bại khi nó là một cuộc gọi hợp lệ. Vì vậy ... nếu xác thực của C đang hoạt động trên mã thông báo do người dùng cung cấp, thì xác thực của người dùng sẽ hết trong cuộc gọi (hiếm khi xảy ra) - trong trường hợp này, mã thông báo phải được mở rộng ở nơi khác trong hệ thống trước khi cuộc gọi này (có thể trong cuộc gọi của A tới SSO). Nhưng không phải vậy, vì vậy hãy trả lại 401 cho bất kỳ nơi nào trong ứng dụng chuyển hướng đến trang đăng nhập.

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