SSO - Đăng nhập một lần - Part 1

LAMP Nov 11, 2020

Bạn có một vài website, bạn muốn khi người dùng đăng nhập vào một website trong hệ thống thì cũng sẽ tự động đăng nhập và sử dụng được tài nguyên trên các website còn lại thì SSO ( Single Sign On ) là cách giúp bạn giải quyết vấn đề này.

Trên thực tế bài toán SSO sẽ có nhiều cách giải quyết khác nhau tùy tưng trường hợp cụ thể, ví dụ như các webstie sử dụng chung domain, database, khác domain, khác db,...

Vấn đề cốt lõi trong bài này mình muốn chia sẽ là cách thức một hệ thống SSO nên được xây dựng như thế nào, còn tùy vào tính huống cụ thể chúng ta có thể thay đổi cho phù hợp.

+ Chúng ta sẽ đi vào một ví dụ cụ thể như sau nhé:

- Mình có 2 domain là domain-1.com, domain-2.com cùng sử dụng chung database, ở đây khi người dùng đăng nhập vào domain-1.com thì cũng phải được tự động đăng nhập vào domain-2.com để sử dụng tài nguyên.

+ Cách giải quyết:

- Để giải quyết bài toán này chúng ta sẽ xây dựng một server trung tâm thực hiện việc authenticate riêng cho hệ thống SSO, đặt tên là domain-auth.com

Các bước thực hiện như sau:

1. Khi người dùng thực hiện đăng nhập trên domain-1.com thực hiện redirect sang domain-auth.com kèm theo url cần chuyển hướng lại sau khi thực hiện login thành công ( Vd: http://domain-auth.com/login?callback=domain-1.com ).

2. domain-auth.com sẽ thực hiện kiêm tra xem có phiên đăng nhập nào chưa, nếu chưa thì chuyển tiếp đến bước 3, nếu có phiên đăng nhập rồi thì chuyển tiếp đến bước 6.

3. Hiển thị form login, sau khi người dùng thực hiện login thành công, server trung tâm sẽ thực hiện login cho user ( tạo ra session của user ) và một token định danh user lưu vào database, cụ thể ở đây là bàng user để xác định rằng user này đã login thành công. Tiếp theo chuyển hướng lại domain-1.com kèm token đã tạo ra ( VD: domain-1.com?token=@#sdhfshwerwhnwewcabc )

4. domain-1.com sử dụng token được trả lại để xác định user đã thực hiện login bằng cách đối chiếu với token được lưu trong database sau đó thực hiện login cho user này, sau đó thực hiện xóa token đã được lưu trong database. Vậy là ở đây chúng ta đã login thành công cho user trên doamin thứ nhất.

5. Khi người dùng truy cập vào domain-2.com cần sử dụng tài nguyên mà user phải login, chúng ta sẽ redirect đến domain-auth.com kèm theo callback url ở đây là domain-2.com ( VD: domain-auth.com/login?callback=domain-2.com )

6. Khi được chuyển hướng đến domain-auth.com sẽ thực hiện kiểm tra đã có phiên đăng nhập nào chưa, nếu đã có phiên đăng nhập rồi sẽ tạo ra một token tương ứng với user và lưu vào database. Sau đó chuyển hướng lại domain-2.com kèm theo token đã tạo ( VD: domain-2.com?token=@#sdhfshwerwhnwewcabc )

7. domain-2.com sử dụng token được trả về và thực hiện login cho user, tiếp đó thực hiện xóa token đã được lưu trong database.

8. Vậy khi người dùng thực hiện đăng xuất trên một domain thì cũng cần đăng xuất trên toàn bộ các domain khác, cái này thú vị nên mình sẽ để trong part 2 nhé :))

***

Tổng kết

Vậy là ở đây chúng ta đã  thực hiện một ví dụ nhỏ về SSO - Đăng nhập một lần. Ở trên chỉ là một hướng dẫn nhỏ để các bạn có thể hiểu về một hệ thống SSO, trên thực tế chúng ta sẽ cần quan tâm hơn nhiều về các vấn đề bảo mật, hiệu xuất của hệ thống.

Hy vọng qua bài này giúp các bạn có cái nhìn đơn giản hơn về một hệ thống SSO và đừng nghĩ nó là cái gì qúa phức tạp.

Hẹn gặp lại các bạn ở part tiếp theo, "Demo sso trên hệ thống sử dụng Laravel", à mà trường hợp bài này được các bạn đánh gía cao  thôi nhé.

Thanks.

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.