Tôi đang xây dựng một loạt các ứng dụng web được kết nối với một điểm xác thực duy nhất. Về cơ bản, người dùng cố gắng truy cập một trang web, nếu không được xác thực, họ sẽ được chuyển hướng đến trang đăng nhập của hệ thống xác thực trung tâm. Khi họ đăng nhập thành công, họ được chuyển hướng đến ứng dụng của họ. Từ đó trở đi, nếu họ truy cập bất kỳ ứng dụng nào khác, họ sẽ tự động đăng nhập.
Một vài chi tiết bổ sung: 1) tất cả các ứng dụng sẽ chạy trong cùng một tên miền, vì vậy tôi có thể sử dụng cookie miền, điều này giúp mọi việc dễ dàng hơn; 2) người dùng có thể được cấp quyền truy cập vào một số ứng dụng chứ không phải các ứng dụng khác, do đó cần phải tính đến; 3) người dùng cần có thể truy xuất các quyền cụ thể cho từng ứng dụng.
Tôi đã thực hiện một cái gì đó, nhưng tôi không hài lòng 100% với nó. Ngay bây giờ, đây là những gì tôi có: 1) ứng dụng web kiểm tra sự tồn tại của phiên (cụ thể cho ứng dụng) và cookie là mã thông báo JWT được gửi từ hệ thống xác thực tập trung; 2) nếu cookie không tồn tại, tôi chuyển hướng đến trang đăng nhập trên hệ thống xác thực; 3) khi người dùng đăng nhập, họ được chuyển hướng đến ứng dụng của họ chuyển qua mã thông báo JWT; 4) ứng dụng xác minh mã thông báo qua lệnh gọi API REST đến hệ thống xác thực (làm cho các lệnh gọi API REST này dựa trên mã thông báo truy cập riêng), nếu nó hợp lệ, thì mã thông báo JWT sẽ được lưu dưới dạng cookie và phiên được bắt đầu bằng người dùng đăng nhập; 5) nếu phiên ứng dụng hết hạn, nó sẽ kiểm tra xem cookie có tồn tại không và nếu có thì ứng dụng sẽ thực hiện giống như bước # 4, xác minh mã thông báo và tạo lại phiên; 6) khi đăng xuất, hệ thống chỉ cần xóa cookie, đảm bảo người dùng đăng xuất khỏi tất cả các ứng dụng; 7) nếu mã thông báo hết hạn, ứng dụng sẽ sử dụng mã thông báo đã hết hạn để yêu cầu mã mới, trong đó chữ ký mã thông báo và các khiếu nại khác được xác thực trước khi phát hành mã mới, điều duy nhất không được xác thực là yêu cầu hết hạn.
Để làm rõ, sự tồn tại của một phiên cụ thể cho ứng dụng được sử dụng để bạn không phải liên tục thực hiện các cuộc gọi API REST để xác minh mã thông báo. Nhưng do mã thông báo đã được xác minh một lần, liệu có an toàn không khi chỉ sử dụng cookie đó làm chỉ báo có phiên hợp lệ?
Một điều mà tôi không chắc chắn là mã thông báo của tôi cần phải có thứ gì đó cho biết ứng dụng đó là gì vì các lệnh gọi API REST khác có thể được thực hiện bằng cách sử dụng mã thông báo để nhận một số tài nguyên dành riêng cho ứng dụng. Nhưng nếu tôi nhận được mã thông báo cho app1 và sau đó đăng nhập vào app2, app2 sẽ dựa vào cookie được tạo bởi app2. Vì vậy, có vẻ như tôi muốn có hai mã thông báo, một mã có thể được lưu trữ dưới dạng cookie miền để cho biết người dùng được xác thực và một mã khác thực sự là ứng dụng cụ thể và có thể được sử dụng để thực hiện các lệnh gọi API REST cho ứng dụng khác- nguồn lực cụ thể.
Tôi có quá phức tạp điều này không, hay dòng suy nghĩ của tôi có khớp với những gì người khác đang nhìn thấy / đang làm ngoài kia không? Hoặc có một cách thanh lịch hơn để làm điều này? Tôi đã nghĩ đến việc triển khai một cái gì đó như Open ID, nhưng có vẻ hơi quá mức cho nhu cầu của chúng tôi. Tôi muốn điều này đơn giản đến mức có thể để tôi có thể ghi lại quá trình và các nhóm nhà phát triển khác có thể phát triển các ứng dụng cắm vào hệ thống xác thực mà không cần quá nhiều trợ giúp.