Oauth2 & OIDC

littlenoteslittlenotes
3 min read

I. Giới thiệu về Oauth2

Oauth2 viết tắt của Open Authorization, là một giao thức ủy quyền, cho phép một ứng dụng truy cập vào tài nguyên trên một dịch vụ khác mà không cần chia sẻ thông tin đăng nhập.
Oauth2 sử dụng Access Token đại diện cho quyền truy cập tài nguyên với danh nghĩa người dùng. Oauth2 không định nghĩa format của Access Token, nó có thể là chuỗi ký tự bất kỳ. Tuy nhiên, thông thường JSON Web Token (JWT) hay được sử dụng. JWT có thể chứa một số thông tin mà bên phát hành token đưa vào và có expired date giúp an toàn hơn về security.
→ Oauth2 là authorization protocol, không phải là authentication protocol

II. Các thành phần trong Oauth2

Có 4 thành phần cơ bản trong Oauth2 flow, bao gồm:

  • Resource owner: Là người dùng sở hữu các tài nguyên và có thể cấp quyền cho phép ứng dụng truy cập tài nguyên đó

  • Client: Là ứng dụng xin quyền để truy cập tài nguyên đó. Khi được resource owner cho quyền, client sẽ được cấp 1 access token để truy cập vào tài nguyên

  • Authorization server: Cấp access token cho client khi được resource owner cho phép.

  • Resource server: Nơi chứa tài nguyên cần truy cập. Resource server nhận request từ client kèm access token và trả về cho client tài nguyên mong muốn.

III. Authorization grant type

Oauth2 cung cấp một số loại authorization grant type phổ biến như:

  • Authorization code

  • Authorization code with PKCE

  • Client credentials

  • Device code

  • Implicit (legacy)

  • Password grant (legacy)

  • etc,…

Trong phạm vi bài viết sẽ nói tới việc sử dụng Authorization code và Authorization code with PKCE

IV. Authorization Flow

Về flow của Authorization code, có một số cách vẽ bao gồm cả User-Agent (chính là Browser) giúp người dùng thao tác nhập thông tin credentials để cho phép cấp quyền cho ứng dụng client. Tuy nhiên về cơ bản thì ta có thể đơn giản flow gồm các step như sau:

Trường hợp sử dụng PKCE (Proof Key for Code Exchange), flow sẽ như sau:

Trong cả 2 flow trên, Authorization server cung cấp 2 endpoint để thực hiện authorize và cấp token.

Trong thực tế, các request gửi yêu cầu ủy quyền(kèm code_challenge) và yêu cầu cấp access token(kèm code_verifier) có thể không phải gửi trực tiếp từ Client App sang Authorization server mà có thể từ Client App gửi request sang Resource server. Tại Resource server sẽ có xử lý generate ra các code_challenge và code_verifier rồi gửi request sang Authorization server.

V. OIDC - Open ID Connect

OIDC là một phần mở rộng được xây dựng dựa trên Oauth2. OIDC kết hợp cùng với Oauth2 giúp xác định danh tính người dùng và các thông tin cơ bản của người dùng.

OIDC hoạt động dựa trên khái niệm ID token. Khi kết hợp với Oauth2, ngoài việc trả về access token, Authorization cũng trả về thêm ID token. ID Token là một JWT và có thể decode để lấy các thông tin người dùng như sub (subject), iss (issuer),…

Flow kết hợp Oauth2 và OIDC cũng tương tự như trên nhưng phần request gửi đi có kèm thêm scope của openid

VI. Tổng kết

  • Oauth2: Là giao thức ủy quyền, cho phép user ủy quyền một ứng dụng bên thứ 3 truy cập vào tài nguyên người dùng mà không cần biết danh tính người dùng thông qua access token

  • OIDC: Là phần mở rộng của Oauth2, hỗ trợ xác đinh danh tính người dùng thông qua id token (JWT)

0
Subscribe to my newsletter

Read articles from littlenotes directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

littlenotes
littlenotes