0
0
Lập trình
Admin Team
Admin Teamtechmely

Thông báo oauth2 v2.0.17 - Token phụ thuộc vào verb

Đăng vào 5 tháng trước

• 4 phút đọc

Thông báo oauth2 v2.0.17 - Token phụ thuộc vào verb

Phiên bản oauth2 v2.0.17 là một bản phát hành nhỏ nhưng hữu ích: nó bổ sung hỗ trợ cho việc cấu hình truyền tải token phụ thuộc vào verb với một Hash tĩnh, bên cạnh Proc đã có trước đó. Điều này làm cho các tích hợp như Graph API của Instagram trở nên đơn giản hơn và hiệu suất cao hơn một chút.

Nội dung tóm tắt (TL;DR)

  • v2.0.15 đã giới thiệu chế độ token phụ thuộc vào verb, cho phép bạn quyết định cho mỗi verb HTTP xem token truy cập có nên được gửi trong chuỗi truy vấn hay trong tiêu đề Authorization.
  • v2.0.17 cho phép bạn cung cấp ánh xạ đó dưới dạng một Hash tĩnh thay vì một Proc.
  • Ví dụ ánh xạ: {get: :query, post: :header, delete: :header}.

Tại sao điều này quan trọng

Một số API (đặc biệt là Graph API của Instagram) yêu cầu bạn gửi token truy cập trong chuỗi truy vấn cho các yêu cầu GET (ví dụ: ?access_token=...), nhưng trong tiêu đề Authorization cho các yêu cầu POST/DELETE (ví dụ: Authorization: Bearer ...).

Trong phiên bản v2.0.15, chúng tôi đã thêm hỗ trợ cho chế độ phụ thuộc vào verb thông qua một Proc, như sau:

ruby Copy
{mode: ->(verb) { verb == :get ? :query : :header }}

Trong phiên bản v2.0.17, bạn có thể cấu hình cùng một hành vi bằng cách sử dụng một Hash tĩnh, điều này giúp tránh việc gọi Proc cho mỗi yêu cầu, giữ cho ý định rõ ràng và có thể dễ dàng tuần tự hóa hoặc tái sử dụng:

ruby Copy
verb_dependent_token = {get: :query, post: :header, delete: :header}

Ví dụ: Instagram Graph API với Hash tĩnh

Dưới đây là một ví dụ cụ thể về việc trao đổi một token ngắn hạn cho một token dài hạn, làm mới nó và sau đó thực hiện các cuộc gọi API - tất cả đều tự động đặt token ở vị trí đúng theo verb HTTP sử dụng chế độ Hash tĩnh.

ruby Copy
require "oauth2"

client = OAuth2::Client.new(nil, nil, site: "https://graph.instagram.com")

# Bắt đầu với một token ngắn hạn mà bạn đã nhận được qua Facebook Login
verb_dependent_token = {get: :query, post: :header, delete: :header}

short_lived = OAuth2::AccessToken.new(
  client,
  ENV["IG_SHORT_LIVED_TOKEN"],
  mode: verb_dependent_token,
)

# 1) Trao đổi cho một token dài hạn (GET với token trong chuỗi truy vấn)
#    Endpoint: GET https://graph.instagram.com/access_token
#    Params: grant_type=ig_exchange_token, client_secret=APP_SECRET
exchange = short_lived.get(
  "/access_token",
  params: {
    grant_type: "ig_exchange_token",
    client_secret: ENV["IG_APP_SECRET"],
    # access_token sẽ được thêm tự động vào chuỗi truy vấn
  },
)
long_lived_token_value = exchange.parsed["access_token"]

long_lived = OAuth2::AccessToken.new(
  client,
  long_lived_token_value,
  mode: verb_dependent_token,
)

# 2) Làm mới token dài hạn (GET với token trong chuỗi truy vấn)
#    Endpoint: GET https://graph.instagram.com/refresh_access_token
refresh_resp = long_lived.get(
  "/refresh_access_token",
  params: {grant_type: "ig_refresh_token"},
)
long_lived = OAuth2::AccessToken.new(
  client,
  refresh_resp.parsed["access_token"],
  mode: verb_dependent_token,
)

# 3) Cuộc gọi API GET điển hình (token tự động trong chuỗi truy vấn)
me = long_lived.get("/me", params: {fields: "id,username"}).parsed

# 4) Ví dụ POST (token tự động trong tiêu đề Authorization)
# long_lived.post("/me/media", body: {image_url: "https://...", caption: "hello"})

Lưu ý

  • Instagram là một trường hợp đặc biệt yêu cầu rõ ràng token trong chuỗi truy vấn cho các endpoint GET. Đối với hầu hết các nhà cung cấp, bạn nên ưu tiên sử dụng token trong tiêu đề khi có thể.
  • Nếu bạn cần logic tùy chỉnh ngoài một ánh xạ đơn giản, bạn vẫn có thể sử dụng Proc: mode: ->(verb) { ... }.

Hướng dẫn chuyển đổi từ Proc sang Hash

Nếu bạn đã sử dụng kiểu Proc v2.0.15:

ruby Copy
{mode: ->(verb) { verb == :get ? :query : :header }}

Bạn có thể chuyển sang định dạng Hash trong v2.0.17:

ruby Copy
{mode: {get: :query, post: :header, delete: :header}}

Cả hai đều được hỗ trợ; hãy chọn cái nào phù hợp nhất với ứng dụng của bạn. Định dạng Hash thường nhanh hơn một chút và rõ ràng hơn, trong khi định dạng Proc thì vô cùng linh hoạt!

Liên kết phát hành

Cảm ơn

Cảm ơn mọi người đã sử dụng oauth2 và báo cáo vấn đề. Hãy tiếp tục gửi phản hồi cho chúng tôi!

Thông tin hỗ trợ và tài trợ

Tôi là một người duy trì FLOSS toàn thời gian. Nếu bạn thấy công việc của tôi có giá trị, tôi mong bạn trở thành một nhà tài trợ. Mỗi đô la đều hữu ích!

🥰 Hỗ trợ công việc FLOSS 🥰 Truy cập Kênh "Nhà tài trợ" trên Galtzo FLOSS Discord 👇️

Hình ảnh (cắt) bởi Wonder KIM trên Unsplash

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào