Hướng dẫn AgentFlow

Xác thực

Gọi API bằng khóa của một chủ thể dịch vụ, cách quyền thực tế được tính ở mỗi yêu cầu, và vì sao token của một người chỉ dùng cho MCP.

Tích hợp gọi với tư cách một chủ thể dịch vụ

Một tích hợp không đăng nhập như một người. Nó gọi với tư cách một chủ thể dịch vụ (service principal), bằng một khóa API gửi trong header Authorization:

curl -sS "$ORIGIN/api/v1/caller" \
  -H "Authorization: Bearer $AGENTFLOW_KEY"

Khóa có dạng afk_…. Cách tạo chủ thể, cấp khóa, xoay vòng và thu hồi khóa nằm ở Chủ thể dịch vụ.

Quyền thực tế của một yêu cầu

Quyền của một yêu cầu được tính lại ở mỗi lần gọi, bằng phép giao của hai thứ:

  • các quyền hiện tại từ vai trò của chủ thể;
  • phạm vi quyền của khóa.

Từ đó suy ra ba điều:

  • Phạm vi quyền của khóa chỉ thu hẹp được. Nó được chốt lúc cấp khóa. Đánh dấu một quyền mà vai trò không có thì không thêm được gì; muốn đổi phạm vi, hãy cấp khóa mới.
  • Sửa vai trò có hiệu lực ngay từ yêu cầu kế tiếp, cho mọi khóa của chủ thể đó.
  • Phạm vi hồ sơ vẫn áp dụng. Với thực thể ở chế độ Hạn chế, chủ thể còn cần một lượt cấp quyền trên chính thực thể đó — xem Quyền truy cập Thực thể & Bản ghi.

GET /caller: khóa đang hành động với tư cách ai

GET /api/v1/caller cho biết yêu cầu đang hành động với tư cách ai, và nó được làm gì ngay lúc này. Đây là cách nhanh nhất để kiểm tra một khóa trước khi làm việc gì khác.

{
  "kind": "service_principal",
  "id": "5b0e2f4c-…",
  "display_name": "Invoice Import",
  "org_id": "9c41d7a0-…",
  "credential_id": "e27a91b3-…",
  "permissions": ["entity.list", "entity.read", "entity.write"],
  "email": null,
  "org_name": "Acme",
  "app": null
}
TrườngÝ nghĩa
kinduser hoặc service_principal.
idId của người, hoặc của chủ thể dịch vụ.
display_nameTên hiển thị.
org_idTổ chức.
credential_idKhóa đã xác thực yêu cầu này; null với một người.
permissionsCác quyền thực tế của yêu cầu này, đã giao với phạm vi của khóa.
emailEmail của người; null với một chủ thể dịch vụ.
org_nameTên hiển thị của tổ chức; null khi AgentFlow chưa biết tên này.
appỨng dụng đã cài đặt mà yêu cầu đi qua, gồm key, name, version, generation và staged_version; null với mọi yêu cầu khác. version là phiên bản gói đang chạy, generation là thế hệ đang chạy, và staged_version là phiên bản mà thế hệ mới nhất đang ở trạng thái đã chuẩn bị hoặc đang kích hoạt sẽ kích hoạt, nếu nó được chuẩn bị sau khi thế hệ đang chạy được kích hoạt (một lần cấu hình lại có cùng phiên bản với version), và là null khi không có thế hệ nào như vậy. Một ứng dụng đăng ký không có gói thì cả ba đều là null.

GET /app/objects: một ứng dụng được dùng những gì

GET /api/v1/app/objects chỉ dành cho ứng dụng đã cài đặt (thao tác đánh dấu x-app-only). Nó cho ứng dụng biết những đối tượng nào của tổ chức nó được dùng — thực thể, trường, quy trình, biểu mẫu và các loại khác — và mỗi đối tượng đang ở state nào: live, deprecated, hoặc off khi nó thuộc một tính năng tùy chọn đang tắt (khi đó key, id và contract là null). Đối tượng nằm ngoài phạm vi ứng dụng được duyệt, và đối tượng đã gỡ, không có trong danh sách. Câu trả lời gồm revision, mảng objects xếp theo logical_key, và parameters: giá trị mà lần cài đặt đang giữ cho từng tham số của ứng dụng, theo khóa — id của nhóm, người dùng, đơn vị hay chủ thể dịch vụ mà tham số trỏ tới, hoặc văn bản, số hay lựa chọn đã nhập. Tham số chưa có giá trị thì không có trong đó, và tham số secret_ref hay connection_ref thì không bao giờ có: các bước dùng đến chúng tự phân giải chúng trên máy chủ. Mọi phản hồi cho một yêu cầu mà lần cài đặt của ứng dụng đã cho qua còn mang header AgentFlow-App-Revision: bản sửa đổi của lần cài đặt tại lúc yêu cầu được cho qua. Đó là một số nguyên dương chỉ tăng, và có thể cũ hơn bản hiện tại. Phản hồi 401, APP_NOT_ASSIGNED và APP_NOT_INSTALLED do bước xác thực trả về không mang header này, vì bước xác thực từ chối các yêu cầu đó trước khi cho qua. Riêng GET /app/objects mang đúng bản sửa đổi mà nội dung của nó được đọc tại đó. Hãy lưu danh sách cùng số này, và chỉ gọi lại GET /app/objects khi một phản hồi mang số lớn hơn số bạn đang giữ. Một yêu cầu không đi qua ứng dụng đã cài đặt — khóa của chủ thể dịch vụ, hay token của một người — nhận 403 APP_CALLER_REQUIRED; yêu cầu chưa xác thực nhận 401.

Người dùng: token riêng chỉ dành cho MCP

Token của một người chỉ dùng tại điểm cuối MCP, khi một trợ lý AI bên ngoài (ví dụ Claude Desktop) làm việc thay người đó, với đúng quyền của người đó. Một người không gọi API REST bằng token của mình.

Ứng dụng web AgentFlow xác thực bằng cookie phiên đăng nhập. Cookie đó chỉ dành cho chính ứng dụng; một tích hợp không dùng nó.

Hiện chưa có cách để một ứng dụng bên thứ ba đăng nhập người dùng rồi gọi API REST thay họ. Ứng dụng đã cài đặt đang được phát triển, mặc định tắt và chưa phát hành rộng rãi. Các thao tác đánh dấu x-person-only — My Work, nhận và giao việc, gửi một bước, thông báo — vì vậy hôm nay chỉ ứng dụng AgentFlow gọi được.

Khi xác thực hoặc phân quyền bị từ chối

Trạng tháiMã (type)Khi nào
401UNAUTHORIZED, INVALID_TOKEN, TOKEN_EXPIRED, SESSION_REVOKEDYêu cầu chưa xác thực được: thiếu hoặc sai thông tin xác thực, khóa không còn hiệu lực, token hết hạn, hoặc phiên đã bị thu hồi.
401DELEGATED_TOKEN_NOT_ACCEPTEDToken do một ứng dụng khác lấy thay mặt người dùng bằng trao đổi token (có claim act). AgentFlow chỉ chấp nhận token do chính nó lấy khi người dùng đăng nhập.
403PERMISSION_DENIED, FORBIDDENĐã xác thực nhưng thiếu quyền cho thao tác này.
403ENDPOINT_NOT_PUBLICKhóa của chủ thể dịch vụ, token bearer của một người, hoặc token của một ứng dụng đã cài đặt, gọi một điểm cuối nội bộ.
403USER_IDENTITY_REQUIREDChủ thể dịch vụ gọi một thao tác x-person-only.
403USER_DEACTIVATEDNgười dùng đã bị vô hiệu hóa.
403WRONG_ORGToken thuộc một tổ chức khác với tổ chức của bản triển khai.
403USER_NOT_PROJECTEDNgười này chưa có tài khoản AgentFlow trong tổ chức của token, và yêu cầu đi qua một kênh không bao giờ tự tạo tài khoản (MCP, hoặc một ứng dụng đã cài đặt). Người đó cần đăng nhập AgentFlow trước.
403APP_NOT_INSTALLEDỨng dụng đã lấy token này chưa được cài đặt, hoặc đang bị tắt, trong tổ chức của token.
403APP_NOT_ASSIGNEDỨng dụng đã được cài đặt, nhưng người dùng không nằm trong số người được phép dùng nó; quản trị viên thêm họ trong trang Ứng dụng đã cài đặt.
403APP_CALLER_REQUIREDMột thao tác x-app-only, như GET /app/objects, được gọi bởi một yêu cầu không đi qua ứng dụng đã cài đặt (chẳng hạn khóa của chủ thể dịch vụ).

Một tài nguyên mà bạn không được phép thấy thì trả 404, không phải 403 — xem Lỗi.

On this page