Tìm hiểu về OAuth
OAuth là gì?
- Định nghĩa
- O có thể hiểu là Open, Auth ở đây là Authorization chứ không phải Authentication.
- OAuth là một phương thức xác thực giúp cho phép truy cập những resource của resource owner bằng cách bật một client application trên HTTP Services như Github, Facebook.
- OAuth cho phép chia sẻ tài nguyên lưu trữ ở site khác mà không cần credentials.
- Có thể dễ hình dung hơn qua ví dụ sau:
- Truy cập vào Tiki và muốn login vào
- Bạn chọn
Login with gmail
- Sau khi click vào sẽ hiện một popup, để ý trên thanh url của popup sẽ là đến từ google (hoặc gmail.com)
- Nhập username, password để đăng nhập vào gmail của bạn
- Sau khi dăng nhập thành công thì bạn sẽ thấy popup tắt và quay lại trang Tiki thì bạn đã đăng nhập
- Khi này bạn sẽ thấy thông tin gmail của bản thân như avatar và tên đã được truy cập và lưu trữ ở Tiki.
- Ở dây có thể thấy chúng ta đã cấp quyền cho Tiki truy cập vào thông tin cơ bản trên Gmail
- Và ví dụ trên cũng chính là mục đích sử dụng của OAuth, ủy quyền cho một ứng dụng bên thứ ba truy cập vào resource ở bên ngoài ứng dụng của bạn mà không cần nhập username, password của bạn trên trang đó.
- Flow
- Hiện tại có 2 version OAuth là OAuth1 và OAuth2
- Thêm nhiều OAuth flow sẽ hỗ trợ tốt hơn cho nhiều ứng dụng không phải trên browser
- Với OAuth1 thì những ứng dụng desktop hay mobile phải hướng dẫn người dùng mở trình duyệt của họ truy cập đến dịch vụ mong muốn và xác thực với service đó sau đó copy token từ đó đưa về ứng dụng. Việc này mang lại trải nghiệm rất tệ.
- Và với OAuth2 thì chúng ta đã có cách khác để có thể lấy ủy quyền (authorization) cho người dùng.
- OAuth2 không còn yêu cầu ứng dụng client phải mã hóa, mà chỉ cần request kèm với
issued token
thông qua HTTPs. Signature của OAuth2 không còn quá phức tạp, không cần phải parsing, sorting hay encoding nữa. - Token trong OAuth2 là
short-lived
. Với OAuth1 thì token gần như là không expired. OAuth2 giới thiệu một loại token đó chính là refresh token. Access token sẽ là short-lived nhưng refresh token sẽ có thời hạn lâu hơn và dùng để yêu cầu cấp một access token mới thay vì bắt user phải xác thực lại với ứng dụng. - Và trong OAuth 2 thì phần tách rõ ràng vai trò giữa server chịu trách nhiệm xử lí request OAuth và server xử lí việc xác thực người dùng.
- Để hiểu rõ hơn quy trình cũng như cách mà OAuth hoạt động thì cùng xem qua những hình minh họa dưới đây.
- OAuth 2 Flow:
- OAuth 1 Flow:
- OAuth Roles:
- Resource Owner: là user đang cấp quyền cho một ứng dụng được truy cập account của họ (dựa trên những quyền mà họ cho phép)
- Client: là ứng dụng đang muốn truy cập account của user. Dĩ nhiên để làm được việc này phải được cho phép bởi user và xác thực thông qua API
- Resource Server: Nơi host những thông tin của user
- Authorization Server: xác thực danh tính của user sao đó cấp access token cho ứng dụng
- Application Registration
- Trước khi muốn sử dụng OAuth2 thì phải đăng kí ứng dụng của bạn với service bên thứ ba.
- Sau khi đã đăng kí thì bạn sẽ nhận lại những thông tin như
Client ID
,Client Secret
- Tiếp theo bạn sẽ cần lựa chọn cần lấy thông tin gì từ user, những lựa chọn này sẽ được hiển thị lúc user cấp quyền cho bạn, gọi là
Authorization Grant
. - Có 3 loại grant:
- Authorization Code: được sử dụng phổ biến vì nó tối ưu cho ứng dụng server-side.
- Bước 1: Authorization Code Link, sẽ chứa thông tin
client_id
,redirect_uri
vàscope
-> tạo thành 1 link để user truy cập - Bước 2: User Authorizes Application, user sẽ click vào link và login trên service để xác thực. Sau đó service sẽ hỏi xem user có muốnc cấp những quyền ở
scope
cho user hay không. - Bước 3: Application Receives Authorization Code, sau khi đã cấp quyền thì service sẽ redirect user về redirect_uri đã khai báo, cùng với một authorization_code.
- Bước 4: Application Request Access Token, ứng dụng sẽ request access token thông qua API gửi authorization code đi kèm với thông tin xác thực, bao gồm
client_secret
tới endpoint API token. - Bước 5: Application Receives Access Token, nếu bước 4 cấp quyền thành công thì gửi response chứa access_token(và có thể có refresh_token) về cho ứng dụng. - Client Credentials: cung cấp cho ứng dụng cách truy cập vào service account. Flow:
- Ứng dụng requests để lấy access token bằng credentials (client ID và client secret) tới authorization server.
- Nếu credential của ứng dụng là chính xác thì authorization server sẽ trả về access token. - Device Code: giúp cho các ứng dụng không phải browser hoặc giới hạn input có thể lấy được access token và truy cập account của user.
- Ví dụ: khi user muốn đăng nhập vào một ứng dụng video streaming trên device mà không có keyboard input như smart TV, …
- Flow:
- User sử dụng ứng dụng trên TV
- Ứng dụng sẽ request POST tới một device authorization endpoint
- Device authorization endpoint (DAE) khác với authentication server, vì DAE không thực sự xác thực device, nó chỉ trả về một device code unique dùng để định danh vs service.
- User truy cập vào verification URL và nhập user code lúc nãy để xác thực account.
- Nếu user approve request thì access endpoint sẽ trả về authentication token.
- Resources:
- https://www.varonis.com/blog/what-is-oauth/
- https://stackoverflow.com/questions/4113934/how-is-oauth-2-different-from-oauth-1/35775049#35775049
- https://www.tutorialspoint.com/oauth2.0/oauth2.0_overview.htm
- https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2