Lại nói về cách làm thế nào để gọi được API các dịch vụ của Google
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Việc tích hợp với API của bên thứ ba có lẽ không còn xa lạ gì với nhiều người. Tùy vào hệ thống sắp sửa phải liên kết mà có cách triển khai và gọi khác nhau, như phương thức HTTP, xác thực client, quyền hạn được truy cập vào những endpoint nào… Mỗi bên, họ đều có những quy tắc và yêu cầu mà chúng ta cần tuân thủ nếu muốn có các cuộc gọi thành công.
Không biết trong đây có bạn đọc nào đã từng tích hợp API của Google chưa chứ tôi thì có vài lần rồi. Lần đầu tiên là gọi API của Google Sheets, cần ghi được dữ liệu vào Sheets riêng tư của người dùng. Thời gian đầu, phải bỏ ra một vài ngày để nghiên cứu cách làm, đọc tài liệu của Google thì bị “loạn xì ngầu” vì cách họ trình bày có phần hơi khó hiểu, hoặc có thể là dễ hiểu cho người đã từng có kinh nghiệm làm rồi. Rất may là cuối cùng việc tích hợp cũng ổn thỏa, tôi đã có thể ghi được dữ liệu bằng cách yêu cầu họ thêm tài khoản Google của mình với quyền ghi vào file Sheets ấy.
Bẵng đi một thời gian sau đó, khi cần phải tích hợp API của Google Analytics thì là một lần… phải nghiên cứu lại. Có lẽ lâu rồi không đụng đến nên tôi quên mất cách làm năm xưa. Nhưng may mắn lần này mất ít thời gian hơn vì dần dần nhớ ra được luồng xử lý trước đó.
Nghĩ rằng sẽ có những người gặp phải trường hợp như tôi, nên trong bài viết này vừa là ghi chép lại cách làm, vừa là hướng dẫn cho người mới trong vấn đề này, hy vọng nó sẽ có ích cho bạn đọc.
Xác thực và ủy quyền
Trước tiên để mà nói, có một vài điểm cần làm sáng tỏ. Sau khi hiểu được một số khái niệm và luồng tích hợp thì vấn đề trở nên dễ hiểu hơn. Google cung cấp hai khái niệm Xác thực và Ủy quyền để cho phép chúng ta thay mặt người dùng tương tác với API của hệ thống. Sau khi xác thực và ủy quyền thành công, có thể thoải mái gọi API để tương tác với dữ liệu của họ.
Vậy thì thế nào là xác thực và ủy quyền?
Hiểu đơn giản, hành vi xác thực để chứng minh bạn sở hữu quyền truy cập vào tài khoản thông qua việc đăng nhập vào tài khoản Google. Nhập thông tin tài khoản và mật khẩu để đăng nhập, bạn đã xác thực thành công. Còn ủy quyền là hình thức chúng ta tạo ra một OAuth 2 Credentials để xin quyền đọc/ghi dữ liệu của người dùng. Sau khi họ ủy quyền cho ứng dụng của chúng ta được phép truy cập, ngay lập tức sẽ có được quyền gọi API.
Vậy thì việc xin được quyền thể hiện ở chỗ nào?
Đó chính là bạn lấy được mã Access Token của người dùng đã ủy quyền cho ứng dụng. Từ mã token đó gọi lên API sẽ lấy được thông tin. Hầu hết các dịch vụ của Google đều yêu cầu Access Token đã được ủy quyền để có thể lấy được dữ liệu.
Hãy tóm tắt lại, quá trình để có thể gọi được API diễn ra như sau: Tạo OAuth 2 Credentials -> Dùng Credentials đó đi xin quyền truy cập vào một dịch vụ nào đó của người dùng -> Lấy được mã Access Token -> Dùng mã đó gọi API.
Rất ngắn gọn phải không!
Tham khảo việc làm Back-end hấp dẫn trên TopDev
Ngoài cách xác thực và ủy quyền thông qua OAuth 2 Credentials ở trên, chúng ta còn có một cách nữa để có được mã Access Token. Nhưng mã token này không phải là của người dùng, mà nó là token của Google Service Account.
Nếu để ý, bạn có thể biết nhiều dịch vụ của Google cho phép chúng ta thêm các tài khoản Google khác vào quản lý với các đặc quyền như chỉ đọc/ghi, hoặc toàn quyền (admin). Google Service Account có thể coi như là một tài khoản Google đặc biệt và có thể được thêm vào làm quản trị. Khi đó tài khoản này cũng có quyền được truy cập vào dữ liệu người dùng nên có thể thông qua nó để lấy được dữ liệu người dùng thông qua API.
Hai cách xin quyền truy cập dịch vụ (ủy quyền)
Vì để cho ngắn gọn và đỡ lan man, bài viết này tôi chỉ trình bày các ý chính của hai cách xin quyền, mã ví dụ sẽ có trong các bài viết tiếp theo.
Scope
Trước khi nói về hai cách, hãy dành thời gian tìm hiểu về scope vì nó khá là quan trọng.
Scope trong Oauth 2 rất quan trọng, nó thể hiện cho việc bạn đang muốn xin quyền gì ở người dùng. Ví dụ như quyền đọc được thông tin tài khoản như họ tên, avatar, địa chỉ email… cho đến các quyền thêm/sửa/xóa dữ liệu của người dùng. Vì thế hãy sử dụng scope để xin những quyền mà bạn thực sự muốn, tránh việc xin các quyền vô lý khác dẫn đến rủi ro cho tài khoản của người dùng, hoặc có thể người dùng sẽ không đồng ý cấp quyền cho bạn.
Về danh sách scope, bạn có thể xem tại OAuth 2.0 Scopes for Google APIs.
Scope luôn xuất hiện ở trong mã, nơi có bất kì yêu cầu xác thực và ủy quyền nào cho người dùng, hãy lưu ý điều đó cho việc viết mã sau này.
Sử dụng chính tài khoản người dùng có quyền truy cập
Rõ rồi, tài khoản người dùng có quyền truy cập vào dịch vụ, nếu lấy được Access Token được ủy quyền từ nó, chúng ta sẽ gọi được API. Đây cũng là cách đầu tiên tôi nghĩ ra để lấy được quyền truy cập vào dữ liệu người dùng.
Cách làm này cũng khá đơn giản, bao gồm các bước chính như sau:
- Tạo một OAuth 2 Credentials bằng cách truy cập vào Credentials.
- Sử dụng Client ID & Client secret được tạo ra để xác thực và ủy quyền tài khoản người dùng
- Lấy được Access Token & Refresh Token, lưu lại chúng vào đâu đó để phục vụ cho việc gọi API sau này.
Client ID sau khi tạo ra, nhúng nó vào trong web thông qua bộ SDK của google, người dùng bấm vào nút “Đăng nhập” một popup mở ra xin quyền truy cập, nếu người dùng đồng ý bạn sẽ lấy được token và ngược lại.
Tuy nhiên cách làm này có một số hạn chế như phải xin quyền trực tiếp từ tài khoản Google của người dùng, rủi ro lộ thông tin cá nhân… Vì lẽ đó, chúng ta có thêm một cách thứ hai dưới đây.
Sử dụng Google Service Accounts
Google Service Accounts (GSA) là một tính năng của Google Cloud Platform (GCP) cho phép các ứng dụng và dịch vụ truy cập các tài nguyên trong môi trường GCP mà không cần sử dụng thông tin đăng nhập của người dùng. Service Accounts cung cấp một cách để xác thực và ủy quyền các ứng dụng và dịch vụ để tương tác với các tài nguyên và API của GCP.
Hiểu đơn giản GSA là một tài khoản Google đặc biệt, được tạo ra và thêm vào các dịch vụ để nó có quyền được truy cập vào dữ liệu. GSA có cơ chế xác thực đơn giản hơn so với tài khoản người dùng, chỉ cần sử dụng một tệp cấu hình của GSA là đã có thể gọi các API của Google.
Các bước sử dụng GSA được tóm tắt như sau:
- Tạo một tài khoản GSA và tải về tệp cấu hình có định dạng JSON
- Thêm tài khoản GSA vừa tạo vào dịch vụ của Google với quyền đọc/ghi tùy mục đích sử dụng.
- Sử dụng thư viện do Google cung cấp tương ứng cho dịch vụ cần tương tác, thêm tệp cấu hình vào để khởi tạo client và thực hiện các cuộc gọi API như bình thường.
Bằng cách làm này, chúng ta có thể bảo vệ được thông tin người dùng, không cần xin phép từ tài khoản của họ. Tất cả những gì cần làm là thêm GSA vào nhóm quản trị với quyền hạn tùy mục đích sử dụng.
Tuy nhiên, một số dịch vụ không chấp nhận thêm tài khoản GSA. Thế nên tùy dịch vụ mà chúng ta cần lựa chọn cách xác thực và ủy quyền sao cho hợp lệ.
Cách gọi API sau khi đã có được mã Access Token
Có nhiều cách để bạn gọi được API, đơn giản và thuận tiện nhất chính là sử dụng các thư viện mà họ cấp.
Ví dụ nếu đang dùng Node.js và muốn gọi API của Google Sheets, bạn có thể sử dụng gói googleapis. Đây là thư viện đóng gói hầu hết các dịch vụ của Google như Oauth 2 đến Google Sheets, Google Driver, Google Analytics…
Một điểm cộng cho việc dùng thư viện nữa là nó sẽ đảm nhận luôn việc xử lý Access Token hết hạn, nghĩa là tự động làm mới mã truy cập thông qua Refresh Token. Tất cả những gì bạn cần làm là tải file cấu hình vào lúc khởi tạo client, sau đó thư viện sẽ cung cấp các hàm kiểm tra, làm mới mã thông báo.
Ngoài ra, chúng ta còn có cách gọi trực tiếp API bằng các Endpoints mà Google cung cấp, tuy nhiên cách này có đôi phần rời rạc và phức tạp hơn do phải xử lý và lưu trữ một lượng endpoint lớn.
Tổng kết
Có thể việc tích hợp API các dịch vụ của Google lần đầu có phần hơi mất thời gian. Nhưng sau khi hiểu được nguyên lý xác thực và ủy quyền đồng thời biết cách sử dụng các thư viện hỗ trợ do chính họ cung cấp thì chúng ta có thể đẩy nhanh quá trình tích hợp sau này.
Bài viết gốc được đăng tải tại 2coffee.dev
Xem thêm:
- Bạn đã biết cách lưu trữ Refresh Token và Access Token an toàn trong trình duyệt chưa?
- Xác thực và phân quyền trong Microservices
- Xây Dựng Hệ Thống Xác Thực Người Dùng Sử Dụng JWT Trong Golang (Phần 1)
Xem thêm Việc làm IT hấp dẫn trên TopDev
- G Giải Quyết Bài Toán Kinh Doanh Bằng Big Data và AI
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- F Framework nào tốt nhất cho dự án của bạn? – Checklist chi tiết
- K Kinh nghiệm xử lý responsive table hiệu quả
- S Stackoverflow là gì? Bí kíp tận dụng Stack Overflow hiệu quả
- 7 7 kinh nghiệm hữu ích khi làm việc với GIT trong dự án
- B Bài tập Python từ cơ bản đến nâng cao (có lời giải)
- B Bảo mật API là gì? Một số nguyên tắc và kỹ thuật cần biết
- H Hướng dẫn cài đặt và tự học lập trình Python cơ bản từ A-Z
- C Chinh Phục Phân Tích Dữ Liệu Với Pandas Trong Python: Hướng Dẫn Từng Bước