Lại nói về cách làm thế nào để gọi được API các dịch vụ của Google

Lại nói về cách làm thế nào để gọi được API các dịch vụ của Google

Threads
  • Thêm một bản folk của VSCode về AI-native IDE. Bạn có thể "cắm" hầu hết các LLMs vào để sử dụng. Mình cũng chưa thử trải nghiệm nữa vì đang hơi lười, nên để đây cho các bạn "ngâm cứu" 😁

    Aide - The open-source AI-native IDE

    » Xem thêm
  • Có bạn nào trong lúc code mà bị "ngẫn tò te" hoặc "lú lẫn" trong mớ hỗn độn của mình viết ra chưa. Những lúc như thế tôi thường hay ngừng lại, thư giãn đầu óc, hoặc để mai tính tiếp. Ấy vậy mà rất hiệu quả nhé! Lúc sau xem lại cái tự nhiên thấy vấn đề ở đâu ngay.

    Hoặc cũng có thể thử áp dụng phương pháp "chú vịt vàng" - thử giải thích vấn đề đang gặp phải với vịt xem, nó sẽ cho thấy mâu thuẫn trong lời nói ra.

    Còn không có tiền mua vịt to thì xe túi mù ra vịt bé giống mình nè 😅

    » Xem thêm
  • Ơ buồn cười thật. Ai cũng biết GIF là định dạng ảnh động thường được dùng thay cho video clip để hiển thị các nội dung ngắn trên nền tảng web. GIF tiện hơn các nội dung dạng video là vì nó được hiển thị như một bức ảnh và được hỗ trợ rộng rãi. Cơ mà GIF có dung lượng nặng quá.

    Nói thật nhiều lúc mình có vài cái hành động muốn hiển thị lên web cho mọi người xem, cơ mà định dạng GIF nó nặng với cả cũng không biết cách tối ưu cho nhẹ xuống. Hôm nay lên mạng tìm hiểu xem định dạng nào có khả năng thay thế GIF trong tương lai thì mọi người biết đó là gì không? Là WEBP (webp)!!! Đúng vậy, là định dạng ảnh mà mình đang dùng trên blog lâu nay luôn á, mà giờ mới biết là nó hiển thị được cả ảnh động nữa, hơi quê 😆

    Kết hợp với ffmpeg nữa là chuyển được tất tần tật video clip thành webp được ngay. Để vài nửa ngồi chế lại cái cli một tí là dùng ngon luôn mọi người ạ 🤪

    » Xem thêm

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.

Tạo OAuth 2 Credentials

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.

Ủy quyền

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!

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.

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (0)

Nội dung bình luận...