Để quản lý xác thực trong kiến trúc microservices, bạn phải có một quan điểm khác.
Hãy nhớ rằng khi bạn làm việc trên một khối nguyên khối, bạn đã có một quy trình xác thực duy nhất.
Ví dụ trong ứng dụng PHP, bạn tìm người dùng của mình trong cơ sở dữ liệu với thông tin đăng nhập tương ứng, sau đó bạn đã tạo phiên mà người dùng được "xác thực".
Với microservices, quy trình làm việc cũng giống nhau. Điều duy nhất thay đổi ngay bây giờ là bạn không thể mở một phiên trong các dịch vụ khác nhau. Hơn nữa, bạn không cần phải có được người dùng được xác thực. Bạn chỉ cần chắc chắn rằng anh ta được phép thực hiện cuộc gọi hiện tại trên các dịch vụ nhỏ của bạn.
Nhờ oauth2, có access_token hợp lệ cung cấp cho bạn thông tin này.
Điều này sẽ trả lời phần giao diện người dùng. Trong phần phụ trợ (ý tôi là phía sau cổng api), bạn không nên quản lý access_token vì nó không liên quan đến microservices. Bạn có thể sử dụng một phím chức năng để tìm bất kỳ thông tin nào liên quan đến người dùng bên trong các dịch vụ nhỏ như một uuid chẳng hạn.
Để nhận được uuid trong khi sử dụng oauth2, tôi cũng khuyên bạn nên sử dụng kết nối openid. Người dùng có giao thức này để quản lý thông tin người dùng cụ thể và nó cung cấp cho bạn quyền truy cập vào một điểm cuối cụ thể "/ userinfo".
Hy vọng giản đồ này sẽ làm cho câu trả lời này rõ ràng hơn.
Nguồn
2017-03-11 10:34:23
Cảm ơn câu trả lời của bạn. Một phần của bài đăng mà tôi thực sự quan tâm là bài viết thứ hai, khi bạn nói "Bạn có thể làm điều đó trong Cổng hoặc trong mỗi dịch vụ". Bạn có thể chi tiết hơn một chút với quảng cáo và khuyết điểm không? : - D – mfrachet
=> Hãy tách ủy quyền khỏi xác thực. Dịch vụ xác thực cung cấp cho "lối vào" "người dùng" một phương tiện để nói "vâng, đó là tôi, đó là phiên của tôi". Việc cho phép người dùng X có thể làm điều gì đó hoặc không thể. Mặc dù xác thực được thực hiện bằng dịch vụ xác thực/oauth, v.v., ủy quyền có thể được kết nối với nhiều quy tắc kinh doanh sâu hơn và phức tạp hơn. Giả sử kiểm tra cổng nếu auth-token hợp lệ và gọi các dịch vụ được bao bọc bằng tiêu đề HTTP X-UserId. Bây giờ các dịch vụ đó cần tự kiểm tra xem người dùng có id đã cho có thể làm điều gì đó không. Ví dụ Nếu UserId == project.ownerId project.save() –
Vì vậy, proxy có thể là NGINX có một số kịch bản truy cập Redis và kiểm tra xem mã thông báo có nằm trong dấu đỏ hay không và chuyển giá trị của mã thông báo từ Redis trong tiêu đề tới các dịch vụ được bao bọc. Hoặc nó có thể là một microservice thông thường. Điều này có thể được xếp lớp theo yêu cầu, với đủ miền phức tạp. –