Dev With Ethan

Blog Lập trình cùng Ethan

OAuth: Các khái niệm cơ bản

Ngày nay, nhu cầu đăng nhậpxác thực người dùng trong các ứng dụng Internet ngày 1 phổ biến. Tuy nhiên có 2 thực trạng:

  • Việc sử dụng hình thức xác thực truyền thống như email/usernamepassword khiến cho người dùng phải nhớ nhiều tài khoản hơn, đồng thời rất khó để nâng cao trải nghiệm người dùng (UX - User Experiences).
  • Các mạng xã hội như Facebook, Google+, Twitter,… càng ngày càng phổ biến, và mỗi người dùng đều có ít nhất 1 tài khoản trên các mạng xã hội này.

Vậy nên, việc liên thông người dùng từ những mạng xã hội này rất có lợi cho những ứng dụng mới: cung cấp cho người dùng 1 trải nghiệm xác thực tài khoản nhanh chóng, tiện lợi, an toàn. Đó là lý do mà OAuth ra đời

1. OAuth là gì? Vì sao phải dùng OAuth?

OAuth là viết tắt của Open Authorization, theo trang web chính thức thì OAuth là:

An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.

(tạm dịch):

Một giao thức mở nhằm cung cấp cách thức đơn giảntiêu chuẩn cho các thao tác xác thực an toàn trong các ứng dụng trên web, mobile & desktop.

Nói chung, nhờ có OAuth mà ta có thể (giả sử như) xây dựng 1 ứng dụng chat thời gian thực, mỗi người dùng khi muốn gửi tin nhắn cho người khác thì cần phải đăng nhập. Khi đó thay vì tự xây dựng 1 hệ thống đăng ký - đăng nhập dùng email & password, chúng ta có thể cung cấp 1 tính năng đăng nhập với Facebook hoặc Google+ với các thao tác như sau:

  • Người dùng mở ứng dụng lần đầu tiên, 2 nút Đăng nhập với FacebookĐăng nhập với Google+ hiện lên.
  • Click vào 1 trong 2 nút, người dùng được chuyển đến trang web đăng nhập của Facebook hoặc Google+.
  • Người dùng tiến hành đăng nhập như bình thường vào FacebookGoogle+, sau khi thành công và cho phép ứng dụng truy cập vào các thông tin liên quan, người dùng được chuyển về ứng dụng.
  • Các thông tin của người dùng đã cài đặt trên FacebookGoogle+ sẽ được lưu và dùng làm thông tin đăng nhập cho người dùng trên ứng dụng của chúng ta.

2. Các khái niệm cơ bản dùng trong OAuth

Thông qua quá trình phát triển, OAuth đã ra mắt thế hệ thứ 2, gọi là OAuth2, là 1 phiên bản nâng cấp hoàn thiện hơn của OAuth đời đầu tiên. Trong bài này chúng ta sẽ sử dụng OAuth2 cho các ví dụ, đơn giản vì nó mới hơn, an toàn hơn và ưu việt hơn so với bản cũ.

Trước khi đi vào chi tiết cơ chế hoạt động, chúng ta cần hiểu rõ 1 số khái niệm cơ bản được dùng với OAuth:

  • Resource: là các thông tin người dùng trên những dịch vụ cung cấp xác thực qua OAuth (Facebook, Google+, Twitter,…). Phần lớn đây là các thông tin cá nhân như email, tên, tuổi, địa chỉ, giới tính,…
  • Resource owner: chính là người dùng sở hữu những resource trên.
  • Resource server: là server của các dịch vụ cung cấp xác thực qua OAuth (Facebook, Google+, Twitter,…).
  • Client application: là ứng dụng của chúng ta muốn truy cập các resource trên resource server.
  • Authorization server: là server dùng để nhận lại các thông tin đã xác thực của người dùng, trong đó quan trọng nhất là access token
  • Access token: là 1 chuỗi ký tự được mã hóa, có giá trị trong 1 thời hạn nhất định, dùng để thay thế cho toàn bộ quá trình xác thực của người dùng. Giả sử người dùng đã xác thực và authorization server nhận được access token hợp lệ, thì trong thời gian nhất định, access token đó sẽ được dùng để truy cập lên resource server và lấy được các thông tin mà người dùng đã cung cấp. Quá thời gian trên, client application cần phải xác thực lại người dùng để lấy được access token mới.
  • Scope: người dùng thường cung cấp nhiều thông tin (email, tên, tuổi, địa chỉ, giới tính,…). Tùy từng mục đích khác nhau mà ứng dụng của chúng ta cần yêu cầu những scope hợp lý, tránh tình trạng lạm dụng và lấy thừa thông tin, vì như vậy sẽ giảm độ tin tưởng của người dùng.
  • Strategy: là 1 tập hợp bao gồm tất cả các định nghĩa trên cho từng dịch vụ, ví dụ Facebook strategy, Google+ strategy, Twitter strategy,…

3. Cơ chế của OAuth

Dưới đây là sơ đồ user-flow của 1 luồng đăng nhập bằng OAuth:

Cơ chế làm việc của OAuth
Cơ chế làm việc của OAuth (Nguồn: Jenkov.com)

Chúng ta có các pha sau đây:

  1. Người dùng truy cập vào ứng dụng.
  2. Người dùng chọn chức năng đăng nhập với Facebook, Google+, Twitter,…
  3. Người dùng được chuyển tới trang đăng nhập của Facebook, Google+, Twitter,…
  4. Người dùng nhập username / email & password trên trang đăng nhập, nếu không đúng sẽ được báo lỗi, nếu đúng, một authentication code được trả về (lưu ý, khác với access token, authentication code chỉ dùng để xác thực quá trình đăng nhập bằng OAuth, không có chức năng thay thế như của access token).
  5. Client App trích xuất authentication code từ thông tin trả về, kết hợp với client id, client secret (những thông tin cố định & bí mật, có chức năng giống như 1 symmetric key để mã hóa / giải mã các thông tin quan trọng trong quá trình đăng nhập).
  6. Sau khi kết hợp, các thông tin này được gửi về resource server để xác thực có đúng là client application đã đăng ký hay không (nhằm tránh các trường hợp tấn công & ăn cắp dữ liệu người dùng).
  7. Sau khi xác thực thành công, access token được trả về client application. Kể từ thời điểm này đến khi hết hạn, access token có thể được dùng để xác thực và truy xuất dữ liệu người dùng tại resource server.
  8. Kết quả cuối cùng trả về: người dùng đã đăng nhập thành công.

Trong bài sau, chúng ta sẽ cùng tìm hiểu cách sử dụng OAuth trong Ruby để đăng nhập với các dịch vụ phổ biến như Facebook, Google+, Twitter,…