Một công ty company
có rất nhiều dịch vụ vd service1
,service2
,service3
việc nhớ hết tài khoản mật khẩu của các dịch vụ này thì rất là mệt.
Mong muốn : Có một trang đăng nhập chung cho tất cả các services của công ty company
=> Từ đó SSO ra đời dựa trên cơ chế cùng origin thì share cookies
Props:
- Giảm số lượng username và password người dùng phải nhớ.
- Giảm số lượng login vào các dịch vụ.
- Phân quyền
Cons:
- Tốn chi phi để chạy SSO server .
- Native app không dùng đc.
**Chú ý:** Khi set cookies để ý thuộc tính domain. phải setdomain cho đúng.
Một domain company.com
các subdomain của nó sẽ là xxx.xxx.company.com
tường minh hơn
service1.company.com
,
service2.company.com
,
service3.company.com
,
Và differnent-company.com
không phải nên nó sẽ ko share domain.
Các domain sẽ dùng:
# sso-login
http://company.trung:5000
http://service.diffent-company.trung:3000
http://service1.company.trung:3001
http://service2.company.trung:3002
http://service3.company.trung:3003
người dùng ->service1 -> chưa auth (cookies ko có or token hết hạn) -direct tới sso-login với params serviceURL -> sso-login;
người dùng nhập username/pass ở sso-login -> server sẽ auth và trả về token-> lưu token vào cookies
. Các domain con sẽ dc share cookies từ domain trang login.
sso-login redirect về lại theo serviceURL.
Nếu ko có serviceURL: Hiển thị danh sách các servíces có thể chọn.
Vi đã đc share cookies nên các service 2 ,3 có thể vào mà không cần đăng nhập.
Nếu vào diffent-company.trung:3000
sẽ không vào đc vì ko đc share cookies
Vì server backend có list các origin, nên các orign cùng subdomain mà ko thuộc list trên BE thì sẽ bị lỗi CORS.
Nếu một trong các domain xoá token thì các domain còn lại sẽ bị xoá token. Phải đăng nhập lại lần đầu.
git clone .....
project vềcd ....
vào các folder để tải cái packages.- Sửa lại file host ở máy cá nhân
Dòng
MacOS
orUbuntu
nằm ở/etc/hosts
.
# demo sso
127.0.0.1 company.trung
127.0.0.1 service.diffent-company.trung
127.0.0.1 service1.company.trung
127.0.0.1 service2.company.trung
127.0.0.1 service3.company.trung
- start các services ở mỗi folder.
Chú ý
- Demo nên việc authen diễn ra đơn giản ko cần phải lưu ở db.
// list tài khoản được đặt ở file
// ./server/ListAccount.js
const ListAccount = [
{
id: 1,
name: "trung",
username: "trungdq1",
password: "trungdq1",
age: 12,
},
// .....
];
- set cookies phải có thuộc tính domain ví dụ:
document.cookie="user_id=1295214458; Path=/; Domain=.company.trung;"
- axios ko cho gửi cookies lên phải gửi tạm qua setcookie, Authentication