I. Khái niệm
Là phương thức xác thực cho phép người dùng đăng nhập vào nhiều ứng dụng hoặc hệ thống trong 1 hệ sinh thái bằng cách đăng nhập 1 lần duy nhất trong hệ sinh thái đó.
Đặc biệt phù hợp với mô hình SaaS, microservices nhằm đảm bảo tính bảo mật và tăng trải nghiệm người dùng trên hệ sinh thái.
II. Phân loại
- SAML: xml based, ra đời trước OpenId Connect vẫn được sử dụng đến thời điểm hiện tại
- OpenId Connect: JSON based, những hệ thống hiện đại ưu tiên sử dụng phương pháp này
Cùng tìm hiểu chi tiết hơn 2 phương pháp này ở phần sau
III. OpenId Connect
OpenId Connect là một tiêu chuẩn mở rộng của OAuth 2.0 nhằm đáp ứng nhu cầu sử dụng một Identity Provider cho mục đích Authentication
& Authorization
Tài liệu chi tiết được mô tả ở đây Tài liệu
Theo tài liệu chính thức của OpenID Connect, có ba phương thức xác thực khác nhau, tuỳ thuộc vào nhu cầu cụ thể của từng hệ thống.
Server flow có thể request refresh_token
để duy trì quyền truy cập, đồng thời, giao tiếp chủ yếu là server-to-server, do đó, User Agent
không cần lưu trữ token
, giúp tăng cường bảo mật\
Ngược lại, implicit flow không cần một server
để tương tác với token endpoint
mà có thể request token
trực tiếp từ authentication endpoint
.
Phương pháp này không yêu cầu gửi nhiều request đến các endpoint
khác nhau. Tuy nhiên, nhược điểm của phương pháp này là token
có thể bị lộ trên User Agent (browser).
Hybrid flow sẽ được mô tả sau.
1. Terminologies
Resource owner: Người sử dụng access vào hệ thống.
VD: người dùng cần đăng nhập vào hệ thống thông qua tính năng [Signin with Google]
Client: Dịch vụ mà người sử dụng muốn access, thông qua OpenId Connect
để xác thực.
VD: muốn support tính năng [Signin with Google], bạn phải đăng ký dịch vụ Google Identity
. Config các thông tin: app_id
, app_secret
, redirectUri
trỏ về endpoint
của client
để nhận Authentication response
Authentication endpoint: Endpoint của OpenId Connect
để nhận Authentication request
trả về Authentication response
có thể chứa code
hoặc token
tương ứng với request_type
của Authentication request
.
VD: Endpoint của Google có dạng: https://accounts.google.com/o/oauth2/v2/auth?…
Token endpoint: Endpoint của OpenId Connect
để nhận Token request
trả về Token response
chứa token
bao gồm cả refresh_token
. Token endpoint
chỉ được sử dụng trong Server Flow
và Hybrid Flow
.
VD: Endpoint của Google có dạng: https://oauth2.googleapis.com/token
Authentication request: GET
request được tạo ra bởi Client
thông qua User Agent
để xác thực
1
2
3
4
5
6
7
GET /authorize?
response_type=code
&scope=openid%20profile%20email
&client_id=s6BhdRkqt3
&state=af0ifjsldkj
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
Host: server.example.com
Authentication response: Response được tạo ra bởi Authentication endpoint
request_type
= code
1
2
3
4
HTTP/1.1 302 Found
Location: https://client.example.org/cb?
code=SplxlOBeZQQYbYS6WxSbIA
&state=af0ifjsldkj
request_type
= token id_token
1
2
3
4
5
6
7
HTTP/1.1 302 Found
Location: https://client.example.org/cb#
access_token=SlAV32hkKG
&token_type=bearer
&id_token=eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso
&expires_in=3600
&state=af0ifjsldkj
Token request: POST
request được tạo ra bởi Client
exchange code
lấy token
1
2
3
4
5
6
7
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
Token response: Response được tạo ra bởi Token endpoint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg"
}
2. Server flow
Trong Authorization Request
set response_type = code
, client
dùng code
này để exchange các token
3. Implicit flow
Trong response_type
của Implicit flow
không có code
, request trực tiếp token
, id_token
hoặc token id_token
đến authentication endpoint
.
IV. SAML
Later