Sự chứng thực (Authentication) là tiến trình xét xem một đối tượng có đúng là nó hay không.
Sự cấp quyền (Authorization) là tiến trình xét xem một đối tượng có một số quyền nào đó hay không.
2. OAuth2 là gì?
OAuth2 là một giao thức cấp quyền mở (open authorization protocol) nhằm cho phép các ứng dụng bên thứ ba truy cập có giới hạn các tài nguyên mà trước đó người dùng đã ủy quyền. Các ứng dụng được ủy quyền và không cần biết định danh (credentials) của người dùng để sử dụng các tài nguyên.
Ví dụ : Một ứng dụng tạo avatar có thể truy cập để thay đổi avatar của người dùng trong Snapchat. Người dùng mở ứng dụng avatar, ứng dụng này yêu cầu người dùng đăng nhập vào nó thông qua Snapchat. Người dùng đăng nhập vào Snapchat và Snapchat gửi người dùng về ứng dụng avatar sau khi đăng nhập thành công. Ứng dụng avatar bây giờ có thể truy cập dữ liệu Snapchat của người dùng và gọi hàm để thay đổi avatar trong Snapchat thay người dùng.
Tham khảo bản đặc tả tại đây
3. Các khái niệm
a. Các vai (roles)
OAuth2 định nghĩa bốn vai sau:
- Chủ sở hữu tài nguyên (Ressource Owner) : là người hay ứng dụng sở hữu dữ liệu muốn chia sẻ, và có thể cấp quyền truy cập đến chúng.
- Máy chủ tài nguyên (Ressource Server): là máy chủ lưu trữ dữ liệu và bảo vệ việc truy cập đến chúng.
- Ứng dụng khách (client) : là ứng dụng thay mặt chủ sở hữu sử dụng các tài nguyên.
- Máy chủ cấp quyền (Authorization Server) : là máy chủ, theo sự đồng ý của chủ tài nguyên, cấp quyền truy cập dữ liệu được bảo vệ cho ứng dụng khách. Nó thực hiện việc này bằng cách cung cấp các thẻ định danh (token) cho ứng dụng khách. Máy chủ cấp quyền cũng có thể đồng thời là máy chủ tài nguyên.
b. Các thẻ (tokens)
Các thẻ là các chuỗi kí tự do máy chủ cấp quyền phát sinh và gởi đi khi ứng dụng khách yêu cầu. OAuth2 dùng thẻ để cấp quyền. Thẻ là danh tính duy nhất mà ứng dụng khách dùng để truy cập tài nguyên mà không cần dùng đến định danh của người dùng. Ta phân biệt hai loại thẻ sau :
- Thẻ truy cập (access token) : Ứng dụng khách sử dụng thẻ này để truy cập dữ liệu của chủ sở hữu trên máy chủ tài nguyên. Nó có thời gian sử dụng ngắn.
OAuth2 định nghĩa hai loại thẻ truy cập chính :
+ Loại thẻ Bearer (bearer token) : sử dụng đơn giản bằng cách thêm thẻ này vào trong câu truy vấn HTTP. Loại này được sử dụng chủ yếu.
+ Loại thẻ MAC (Message Authentication Code token) : cần phải phát sinh MAC key và thẻ truy cập (access token) dùng để ký một số thành phần của câu truy vấn HTTP
- Thẻ làm mới (refresh token) : Thẻ làm mới này không bắt buộc, dùng để lấy một thẻ truy cập mới khi thẻ truy cập hiện tại hết hiệu lực. Thẻ này có thời gian sử dụng lâu hơn thẻ truy cập.
c. Đăng kí ứng dụng khách
Trước khi một ứng dụng khách có thể yêu cầu truy cập đến dữ liệu trên máy chủ tài nguyên, nó phải đăng kí với máy chủ cấp quyền của máy chủ tài nguyên. Việc đăng kí này thực hiện một lần.
Một khi đăng kí, máy chủ cấp quyền sẽ gửi định danh khách (client id), và mật khẩu (client secret). Định danh và mật khẩu này là duy nhất cho ứng dụng khách trên máy chủ cấp quyền.
4. Cấp quyền (Authorization Grant)
Chủ sở hữu cấp quyền cho ứng dụng khách thông qua máy chủ cấp quyền của máy chủ tài nguyên.
OAuth2 đặc tả bốn loại cấp quyền khác nhau sau đây : authorization code, implicit grant, resource owner password credentials và client credentials.
a. Authorization Code (mã cấp quyền)
(1) Chủ sở hữu truy cập ứng dụng khách
(2) Thay vì yêu cầu cấp quyền trực tiếp từ chủ sở hữu, ứng dụng khách thông báo chuyển chủ sở hữu đến máy chủ cấp quyền.
(3) Để đăng nhập với máy chủ cấp quyền, chủ sở hữu được ứng dụng khách chuyển tới máy chủ cấp quyền. Đồng thời ứng dụng khách gửi kèm theo định danh và đường dẫn chuyển hướng của nó (client id, redirection URI)
(4) sau khi đăng nhập thành công, máy chủ cấp quyền hỏi chủ sở hữu có đồng ý cho ứng dụng khách truy cập tài nguyên hay không.
(5) Nếu chủ sở hữu đồng ý, đến lượt máy chủ cấp quyền chuyển chủ sở hữu về ứng dụng khách cùng với mã cấp quyền (authorization code). Vì chủ sở hữu chỉ chứng thực (authenticate) với máy chủ cấp quyền nên định danh của chủ sở hữu không cần phải chia sẻ với ứng dụng khách.
(6) Ứng dụng khách yêu cầu máy chủ cấp quyền cấp thẻ truy cập (acces token) bằng cách gởi đi mã cấp quyền vừa nhận được, định danh khách và đường dẫn chuyển hướng trong câu truy vấn HTTP
(7) Máy chủ cấp quyền chứng thực ứng dụng khách, kiểm tra có đúng mã cấp quyền và đường dẫn chuyển hướng của ứng dụng này hay không. Nếu hợp lệ, máy chủ gửi trả lời là thẻ truy cập, và có thể cả thẻ làm mới (refresh token)
(8) Ứng dụng khách từ bây giờ có thể dùng thẻ truy cập nhận được để truy vấn tài nguyên trong máy chủ tài nguyên. Thẻ truy cập được dùng để chứng thực ứng dụng khách và chủ sở hữu đồng thời cho phép truy cập tài nguyên
+----------+ +----------+ +---------------+ +-----------+ | Resource | | Client | | Authorization | | Resource | | Owner | | | | Server | | Server | | | | | | | | | +----------+ +----------+ +---------------+ +-----------+ | | | | |>-(1)-Access client-->| | | | | | | |<-(2)-Login via------<| | | | Authorization server| | | | | | | |>---------------------|--(3)-Login via Authorization --->| | | | server & client id + redirect URI| | | | | | |<---------------------|--(4)-Demande grant access ------<| | | | | | | | | | |>---------------------|--(5)-Grant access--------------->| | | |<-(5)-Authorization code---------<| | | | | | | |--(6)-Request access token------->| | | |Auth. code,client id, redirect URI| | | | | | | |<-(7)- Access token, optionally--<| | | | refresh token | | | | | | |>-(8)-Access client-->| | | | |>---------------------------------|(8)-Request ressource->| | | |access token, client id| | | | | | | |<-(8)-Verify access --<| | | | token | | | | | | |<---------------------------------|--(8)-Return ---------<| | | | ressource | | | | | |<-(8)show ressource--<| | |
b. Implicit (Ngầm định)
(1) Chủ sở hữu truy cập ứng dụng khách
(2) Thay vì yêu cầu cấp quyền trực tiếp từ chủ sở hữu, ứng dụng khách thông báo chuyển chủ sở hữu đến máy chủ cấp quyền.
(3) Để đăng nhập với máy chủ cấp quyền, chủ sở hữu được ứng dụng khách chuyển tới máy chủ cấp quyền. Đồng thời ứng dụng khách gửi kèm theo định danh và đường dẫn chuyển hướng của nó (client id, redirection URI)
(4) Thay vì nhận mã cấp quyền, ứng dụng khách nhận lập tức thẻ truy cập. Sự cấp quyền được ngầm định vì không có sử dụng định danh trung gian (mã cấp quyền như ở trên, để sau đó lấy thẻ truy cập). Nó không cung cấp thẻ làm mới.
(5) Ứng dụng khách từ bây giờ có thể dùng thẻ truy cập nhận được để truy vấn tài nguyên trong máy chủ tài nguyên. Thẻ truy cập được dùng để chứng thực ứng dụng khách và chủ sở hữu đồng thời cho phép truy cập tài nguyên
Các ứng dụng khách này có đặc thù là được cài đặt trong trình duyệt và dùng ngôn ngữ thông dịch chẳng hạn như JavaScript
+----------+ +----------+ +---------------+ +-----------+ | Resource | | Client | | Authorization | | Resource | | Owner | | | | Server | | Server | | | | | | | | | +----------+ +----------+ +---------------+ +-----------+ | | | | |>-(1)-Access client-->| | | | | | | |<-(2)-Login via------<| | | | Authorization server| | | | | | | |>---------------------|--(3)-Login via Authorization --->| | | | server & client id + redirect URI| | | | | | | |<-(4)- Access token ------------<| | | | | | | | | | |>-(5)-Access client-->| | | | |>---------------------------------|(5)-Request ressource->| | | |access token, client id| | | | | | | |<-(5)-Verify access --<| | | | token | | | | | | |<---------------------------------|--(5)-Return ---------<| | | | ressource | | | | | |<-(5)show ressource--<| | |
c. Resource Owner Password Credentials (Định danh chủ sở hữu)
(1) Chủ sở hữu cung cấp cho ứng dụng khách danh tính và mật khẩu của mình (username, password)
(2) Ứng dụng khách yêu cầu thẻ truy cập bằng cách gửi định danh của chủ sở hữu đến máy chủ cấp quyền. Qua đó, ứng dụng khách chứng thực với máy chủ cấp quyền
(3) Máy chủ cấp quyền chứng thực ứng dụng khách và chủ sở hữu và nếu hợp lệ gởi trả lời bằng thẻ cấp quyền
(4) Ứng dụng khách từ bây giờ có thể dùng thẻ truy cập nhận được để truy vấn tài nguyên trong máy chủ tài nguyên. Thẻ truy cập được dùng để chứng thực ứng dụng khách và chủ sở hữu đồng thời cho phép truy cập tài nguyên
Dạng này dùng trực tiếp định danh (danh tính và mật khẩu) của chủ sở hữu như một cấp quyền để lấy thẻ truy cập, chỉ nên sử dụng khi thật tin tưởng ứng dụng khách và khi không dùng được các hình thức cấp quyền khác .
Tuy dạng cấp quyền này đòi ứng dụng khách sử dụng trực tiếp định danh của chủ sở hữu, định danh này chỉ sử dụng một lần để đổi lấy thẻ truy cập. Dạng cấp quyền này có thể tránh việc lưu trữ định danh của chủ sở hữu bằng cách đổi lấy một thẻ truy cập với hiệu lực lâu hoặc một thẻ làm mới
+----------+ +----------+ +---------------+ +-----------+ | Resource | | Client | | Authorization | | Resource | | Owner | | | | Server | | Server | | | | | | | | | +----------+ +----------+ +---------------+ +-----------+ | | | | |>-(1)-Resource owner->| | | | Password Credentials| | | | | | | | |>-(2)-Resource owner ------------>| | | | Password Credentials | | | | | | | |<-(3)- Access token ------------<| | | | (w/ optional refresh token) | | | | | | |>-(4)-Access client-->| | | | |>---------------------------------|(4)-Request ressource->| | | |access token, client id| | | | | | | |<-(4)-Verify access --<| | | | token | | | | | | |<---------------------------------|--(4)-Return ---------<| | | | ressource | | | | | |<-(4)show ressource--<| | |
d. Client Credentials (định danh ứng dụng khách)
(1) Ứng dụng khách chứng thực với máy chủ cấp quyền và yêu cầu thẻ truy cập
(2) Máy chủ cấp quyền chứng thực ứng dụng khách, nếu đúng nó trả lời bằng một thẻ truy cập
(3) Ứng dụng khách từ bây giờ có thể dùng thẻ truy cập nhận được để truy vấn tài nguyên trong máy chủ tài nguyên. Thẻ truy cập được dùng để chứng thực ứng dụng khách và chủ sở hữu, đồng thời cho phép truy cập tài nguyên
Dạng cấp quyển theo định danh ứng dụng khách được sử dụng khi ứng dụng khách cần truy cập dữ liệu không liên quan đến một chủ sở hữu cụ thể nào trên máy chủ tài nguyên. Trong trường hợp này ứng dụng khách đồng thời là chủ sở hữu
+----------+ +---------------+ +-----------+ | Client | | Authorization | | Resource | | | | Server | | Server | | | | | | | +----------+ +---------------+ +-----------+ | | | |>-(1)-Client Authentication------>| | | | | | | | |<-(2)- Access token ------------<| | | | | | | | |>---------------------------------|(3)-Request ressource->| | |access token, client id| | | | | |<-(3)-Verify access --<| | | token | | | | |<---------------------------------|--(3)-Return ---------<| | | ressource |
4. Ví dụ dùng client credentials
Trong trường hợp này grant_type=client_credentials
a. Yêu cầu một thẻ truy cập
Ví dụ câu truy vấn HTTP
POST /oauth2/token HTTP/1.1 Host: openspace.vn Content-Type: application/x-www-form-urlencoded grant_type=client_credentials&client_id=XXX&client_secret=XXX
Ví dụ nội dung câu trả lời HTTP
{ "access_token":"eyJraWQiOiJ0ZXN0X2Vudl9r[...]BpHhqUgQUlRngJuLxSW_ZGFXw", "token_type":"Bearer", "expires_in":900, }
phần access_token là nội dung thẻ truy cập
b. Sử dụng thẻ truy cập
Ví dụ thêm một điện thoại vào danh sách
POST /services/addMobile HTTP/1.1 Host: openspace.vn Content-Type: application/json;charset=UTF-8 Authorization: Bearer eyJraWQiOiJ0ZXN0X2Vudl9r[...]BpHhqUgQUlRngJuLxSW_ZGFXw { "name": "Samsung Galaxy II", "manufacturer": "Samsung", "os": "Android" }
©Copyright OpenSpaceVN