Quan tâm, cơ mà cho mình hỏi trước mình cũng mày mọ dự án cá nhân spring boot microservice như thế này, nhưng mà thất bại do hơi mất time mà đang còn nhiều thứ khác quan trọng hơn. Với lại mình cảm giác như mình đang bị hiểu sai một vấn đề gì đó. Mình triển khai như sau:
- Sử dụng Spring Authorization Server implement 1 cái Auth-server đóng vai OAuth2 server
- Gateway: dùng Spring Cloud Gateway implement 1 cái gateway, đóng vai trò là OAuth2 client. Khúc này cũng hơi hắc não xíu do gateway nó dùng Web Reactive.
- Các microservice đứng sau đóng vai trò là OAuth2 resources.
Khi request gọi tới gateway, nếu nó chưa được xác thực sẽ được chuyển hướng qua Auth-server, xác thực xong sẽ có quyền gọi vào các service. Toàn bộ các quá trình này đều diễn ra ở Gateway. Đại loại trông nó giống như đăng nhập bằng Google vậy.
Nhưng mà mình cứ cảm giác nó cấn cấn cái gì đó nên nếu có gì hiểu sai mong anh em chỉ giáo thêm
Bạn làm đúng rồi không sai đâu, thiết kế thì nó không có đúng-sai trắng-đen chỉ là phù hợp hay không phù hợp.
Bài toán AuthN/AuthZ trong hệ thống SOA/Microservices nói chung là bài toán phức tạp phụ thuộc business nên ko có thiết kế nào là chuẩn, nó phụ thuộc vào business nhưng mà có vài yếu tố ntn bạn có thể nghiền ngẫm thế nào cho phù hợp:
1. Stateless, stateful hay hybrid
access_token?
Stateless thì dùng các format như JWT, PASETO... bên trong có thể embed claims, permissions... để phục vụ AuthZ nhưng ngộ nhỡ permissions quá nhiều thì sao?
Stateful thì dùng một opaque string nào đó unique/random/secure để làm
access_token, cách này thì có vẻ an toàn hơn nhưng đòi hỏi OAuth Server (OS) phải có introspection endpoints để client query thêm thông tin, tăng workloaf cho OS.
Hybrid thì kết hợp bên ngoài là stateful bên trong là stateless, đi qua gateway nó sẽ translate stateful token -> stateless token.
2. Impl AuthN/AuthZ checker ở đâu?
Thường thì khi bạn đọc tài liệu trên mạng thì hay thấy người ta đặt checker ở gateway, cách này thì dễ quản lý tập trung nhưng mà có những logic đòi hỏi granular hơn thì lại ko làm dc. Đòi hỏi phải impl thêm phía services.
3. AuthN/AuthZ model
Chỗ này thì lại càng phức tạp phải cân nhắc với business. Vd ông business đòi hỏi phải impl RBAC level 1/2 gì đấy cho hệ thống thì phải làm sao?