Có rất nhiều thông tin trên mạng về việc sử dụng JWT ( Json Web Token
) để xác thực. Nhưng tôi vẫn không tìm thấy lời giải thích rõ ràng về quy trình phải như thế nào khi sử dụng mã thông báo JWT cho giải pháp đăng nhập một lần trong môi trường nhiều miền .
Tôi làm việc cho một công ty có rất nhiều trang web trên các máy chủ khác nhau. Hãy sử dụng example1.com và example2.com . Chúng tôi cần một giải pháp đăng nhập một lần, có nghĩa là nếu người dùng xác thực trên example1.com , chúng tôi muốn anh ta cũng được xác thực trên example2.com , tự động.
Sử dụng luồng OpenId Connect , tôi hiểu rằng người dùng muốn xác thực trên example1.com trước tiên sẽ được chuyển hướng đến máy chủ xác thực (hoặc OP
: "Nhà cung cấp OpenId"). Người dùng xác thực trên máy chủ đó, sau đó chuyển hướng anh ta trở lại trang web example1.com ban đầu bằng mã thông báo JWT đã ký. (Tôi hiểu rằng có một luồng khác trả về mã thông báo trung gian mà chính nó có thể được trao đổi lấy mã thông báo JWT thực sau này, nhưng tôi không nghĩ rằng điều này là bắt buộc đối với chúng tôi) ...
Vì vậy, bây giờ người dùng đã trở lại example1.com và được xác thực! Anh ta có thể đưa ra yêu cầu, chuyển mã thông báo JWT trong Authentication
tiêu đề và máy chủ có thể xác minh JWT đã ký và do đó có thể xác định người dùng. Đẹp!
Câu hỏi đầu tiên:
Mã thông báo JWT nên được lưu trữ trên máy khách như thế nào? Một lần nữa, có rất nhiều thông tin về điều này, và mọi người dường như đồng ý rằng sử dụng Web Storage
là cách để đi thay vì tốt cũ cookies
. Chúng tôi muốn JWT liên tục giữa các lần khởi động lại trình duyệt, vì vậy hãy sử dụng Local Storage
, không Session Storage
...
Bây giờ người dùng có thể khởi động lại trình duyệt của mình và anh ta sẽ vẫn được xác thực trên example1.com , miễn là mã thông báo JWT chưa hết hạn!
Ngoài ra, nếu example1.com cần thực hiện một yêu cầu Ajax tới một miền khác của chúng tôi, tôi hiểu việc định cấu hình CORS sẽ cho phép điều đó. Nhưng trường hợp sử dụng chính của chúng tôi không phải là yêu cầu tên miền chéo mà là có một giải pháp đăng nhập duy nhất !
Do đó, câu hỏi chính:
Bây giờ, quy trình sẽ như thế nào, nếu người dùng truy cập example2.com và chúng tôi muốn anh ta được xác thực bằng cách sử dụng mã thông báo JWT mà anh ta đã có? Local Storage
dường như không cho phép truy cập tên miền chéo vì vậy tại thời điểm này, trình duyệt không thể đọc mã thông báo JWT để thực hiện yêu cầu tới example2.com !
Nên :
- Người dùng lại được chuyển hướng đến máy chủ xác thực ? Khi người dùng xác thực cho example1.com , máy chủ xác thực có thể đã đặt một cookie cho người dùng nên yêu cầu xác thực mới này cho example2.com có thể sử dụng cookie đó để biết rằng người dùng đã được xác thực và ngay lập tức chuyển hướng người đó trở lại example2.com với cùng một mã thông báo JWT?
- Hoặc trình duyệt, trên example2.com , có thể truy cập mã thông báo JWT mà không cần phải truy cập lại máy chủ xác thực không? Tôi thấy có những giải pháp lưu trữ chéo , nhưng những giải pháp đó có được sử dụng rộng rãi không? Chúng có phải là giải pháp được đề xuất cho môi trường SSO tên miền chéo không?
Chúng tôi không muốn bất cứ thứ gì lạ mắt, chúng tôi sẽ hài lòng với giải pháp được sử dụng nhiều nhất!