Sự khác nhau giữa OpenID Connect và OAuth 2.0

353

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Mình đã giới thiệu với các bạn về OAuth 2.0 và OAuth 2.0 chỉ là một framework liên quan đến Authorization, nghĩa là nó chỉ định nghĩa những resources nào mà một Client Application có thể sử dụng trong access token, để khi request tới Resource Server, Resource Server sẽ căn cứ vào access token để quyết định có cho phép Client Application access tới resource hay là không?

  Authorization Code grant type với Proof Key for Code Exchange (PKCE) trong OAuth 2.1
  Building Microservices Application - Phần 3: Xác thực API bằng Oauth 2.0

Thế nhưng nói về security, các bạn có thể biết, chúng ta còn có cả authentication và OpenID Connect là một extension của OAuth 2.0 được giới thiệu để bổ sung phần authentication này. Sử dụng OpenId Connect thì nội dung của access token mà Client Application sử dụng để request tới Resource Server sẽ bao gồm cả thông tin user đang grant quyền truy cập tới những resources này.

Trong OpenID Connect thì Authorization Server được gọi là Identity Provider. Identity Provider sẽ đảm nhận chức năng authentication và authorization.

Access token được issue bởi một Identity Provider như mình đã nói, sẽ chứa thông tin của authenticated user, những thông tin này gọi là Idenitity Token hay gọi tắt là ID token.

Dưới đây là nội dung của một access token mà mình đã decode sử dụng trang web https://jwt.io/:

{
"exp": 1625973312,
"iat": 1625973012,
"jti": "57e9401f-c98b-43a3-9b5e-eb7bff182a5f",
"iss": "http://localhost:8080/auth/realms/huongdanjava",
"aud": "account",
"sub": "8a5092fa-d815-4620-92ab-4ac87542685c",
"typ": "Bearer",
"azp": "angular-test",
"session_state": "0e044481-02e3-4962-adaa-0683c2c26fbf",
"acr": "1",
"realm_access": {
"roles": [
"offline_access",
"uma_authorization",
"default-roles-huongdanjava"
]
},
"resource_access": {
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
},
"scope": "email profile",
"email_verified": false,
"name": "Khanh Nguyen",
"preferred_username": "huongdanjava",
"locale": "en",
"given_name": "Khanh",
"family_name": "Nguyen",
"email": "huongdanjava.com@gmail.com"
}

Phần nội dung phía dưới claim ‘scope’, mà mình đánh dấu trong access token ở trên, chính là nội dung của ID token đó các bạn. Các bạn có thể thấy đây là những thông tin về user đã đăng nhập và grant access cho Client Application. Các bạn có thể xem thông tin những standard claims của ID token tại đây.

Các open source Identity and Access Management hiện nay ví dụ như Keycloak đều hiện thực OpenID Connect luôn chứ không chỉ OAuth 2.0.

Bài viết gốc được đăng tải tại huongdanjava.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev