Saturday, August 7, 2021

Các loại OAuth 2.0 authorization grant types

 OAuth2 xác định 4 loại cấp quyền tùy thuộc vào vị trí và tính chất của khách (client) liên quan đến việc lấy mã xác thực truy cập.



1. Authorization Code Grant Flow

Khi nào nó nên được sử dụng?

  • Nó nên được sử dụng ngay khi máy khách là máy chủ web. Nó cho phép bạn có được mã xác thực truy cập tồn tại lâu dài vì nó có thể được gia hạn bằng mã xác thực làm mới (nếu máy chủ xác thực cho phép điều đó).

Ví dụ:

  • Chủ sở hữu tài nguyên: bạn.
  • Máy chủ tài nguyên: một máy chủ của Google.
  • Khách hàng: bất kỳ trang web nào.
  • Máy chủ xác thực: một máy chủ của Google.

Tình huống:

  • Một trang web muốn lấy thông tin về hồ sơ trên Google của bạn. Bạn được chuyển hướng bởi khách (trang web) đến máy chủ xác thực (Google). Nếu bạn cho phép truy cập, máy chủ xác thực sẽ gửi mã xác thực (authorization code) đến máy khách (trang web) trong phản hồi (callback response). Sau đó, mã này được trao đổi (exchange) với mã xác thực truy cập giữa máy khách và máy chủ xác thực. Trang web lúc này có thể sử dụng mã xác thực truy cập này để truy vấn máy chủ tài nguyên (Google) và truy xuất dữ liệu hồ sơ của bạn. Bạn không bao giờ nhìn thấy mã xác thực truy cập, nó sẽ được lưu trữ bởi trang web (ví dụ: trong phiên). Google cũng gửi thông tin khác cùng với mã xác thực truy cập, chẳng hạn như thời gian tồn tại của mã xác thực (token lifetime) và cuối cùng là mã xác thực làm mới (refresh token). Đây là tình huống lý tưởng và an toàn hơn vì mã xác thực truy cập không được chuyển (pass) qua phía máy khách (trình duyệt web trong ví dụ).

Sơ đồ trình tự


2. Implicit grant Flow:

Khi nào nó nên được sử dụng?

  • Nó thường được sử dụng khi máy khách đang chạy trong trình duyệt sử dụng ngôn ngữ kịch bản như Javascript. Loại cấp quyền này không cho phép phát hành mã xác thực làm mới (refresh token).

Ví dụ:

  • Chủ sở hữu tài nguyên: bạn.
  • Máy chủ tài nguyên: một máy chủ Facebook.
  • Khách hàng: một trang web sử dụng AngularJS chẳng hạn.
  • Máy chủ ủy quyền: một máy chủ Facebook.

Tình huống:

  • Khách hàng (AngularJS) muốn lấy thông tin về hồ sơ Facebook của bạn.
  • Bạn được trình duyệt chuyển hướng đến máy chủ xác thực (Facebook).
  • Nếu bạn cho phép truy cập, máy chủ xác thực sẽ chuyển hướng bạn đến trang web có mã xác thực truy cập trong phân đoạn (fragment) URI (không được gửi đến máy chủ web). Ví dụ về gọi lại (callback): http://example.com/oauthcallback#access_token=MzJmNDc3M2VjMmQzN.
  • Mã thông báo truy cập này lúc này có thể được máy khách (AngularJS) truy xuất và sử dụng để truy vấn máy chủ tài nguyên (Facebook). Ví dụ về truy vấn: https://graph.facebook.com/me?access_token=MzJmNDc3M2VjMmQzN.

Có thể bạn tự hỏi làm cách nào mà ứng dụng khách có thể thực hiện lời gọi đến API Facebook bằng Javascript mà không bị chặn vì chính sách nguồn gốc giống nhau (Same Origin Policy)? Yêu cầu tên miền chéo (cross-domain request) này có thể thực hiện được vì Facebook cho phép nó nhờ header có tên Access-Control-Allow-Origin hiện diện trong phản hồi.

Lưu ý: loại xác thực này chỉ nên được sử dụng nếu không còn loại nào khác. Thật vậy, nó là loại kém an toàn nhất vì mã xác thực truy cập sẽ bị lộ (và do đó dễ bị tấn công) ở phía khách.

Sơ đồ trình tự


3. Resource Owner Password Credentials Grant Flow:

Khi nào nó nên được sử dụng?

  • Với loại cấp quyền này, thông tin xác thực (mật khẩu) được gửi đến máy khách và sau đó đến máy chủ xác thực. Do đó bắt buộc phải có sự tin tưởng tuyệt đối giữa hai chủ thể này. Nó chủ yếu được sử dụng khi máy khách đã được phát triển bởi cùng nhà phát triển với máy chủ xác thực. Ví dụ: chúng ta có thể tưởng tượng một trang web có tên example.com đang tìm kiếm quyền truy cập vào các tài nguyên được bảo vệ của tên miền phụ api.example.com của chính nó. Người dùng sẽ không ngạc nhiên khi nhập thông tin đăng nhập / mật khẩu của mình trên trang web example.com vì tài khoản của họ đã được tạo trên đó.

Ví dụ:

  • Chủ sở hữu tài nguyên: bạn có tài khoản trên trang web acme.com của công ty Acme.
  • Máy chủ tài nguyên: Công ty Acme tiết lộ API của mình tại api.acme.com.
  • Khách hàng: trang web acme.com từ công ty Acme.
  • Máy chủ ủy quyền: một máy chủ Acme.

Tình huống:

  • Công ty Acme, đang hoạt động tốt, nghĩ rằng sẽ cung cấp một API RESTful cho các ứng dụng của bên thứ ba.
  • Công ty này cho rằng sẽ thuận tiện khi sử dụng API của riêng mình để tránh phải “tái tạo lại bánh xe”.
  • Công ty cần một mã xác thực truy cập để gọi các phương thức của API của riêng mình.
  • Để làm điều này, công ty yêu cầu bạn nhập thông tin đăng nhập của bạn thông qua một biểu mẫu HTML tiêu chuẩn như bạn thường làm.
  • Ứng dụng phía máy chủ (trang web acme.com) sẽ trao đổi thông tin đăng nhập của bạn với mã xác thực truy cập từ máy chủ xác thực (tất nhiên nếu thông tin đăng nhập của bạn hợp lệ).
  • Giờ Ứng dụng này có thể sử dụng mã xác thực truy cập để truy vấn máy chủ tài nguyên của chính nó (api.acme.com).

Sơ đồ trình tự:


4. Client Credentials Grant Flow:

Khi nào nó nên được sử dụng?

  • Loại cấp quyền này được sử dụng khi khách là chủ sở hữu tài nguyên. Sẽ không có xác thực để lấy từ người dùng cuối.

Ví dụ:

  • Chủ sở hữu tài nguyên: bất kỳ trang web nào.
  • Máy chủ tài nguyên: Google Cloud Storage.
  • Khách hàng: chủ sở hữu tài nguyên.
  • Máy chủ ủy quyền: một máy chủ của Google.

Tình huống:

  • Trang web lưu trữ các file của nó trên Google Cloud Storage.
  • Trang web phải thông qua API của Google để truy xuất hoặc sửa đổi tệp và phải xác thực với máy chủ xác thực.
  • Sau khi được xác thực, trang web sẽ nhận được mã thông báo truy cập hiện có thể được sử dụng để truy vấn máy chủ tài nguyên (Google Cloud Storage).

Ở đây, người dùng cuối không phải cấp quyền truy cập vào máy chủ tài nguyên.

Sơ đồ trình tự:














No comments:

Post a Comment

So sánh các GitFlow model và áp dụng với CICD

https://medium.com/oho-software/so-s%C3%A1nh-c%C3%A1c-gitflow-model-v%C3%A0-%C3%A1p-d%E1%BB%A5ng-v%E1%BB%9Bi-cicd-b6581cfc893a