Every generation of identity protocols answers the same question
Identity technology is thirty years old. Compress those thirty years into one sentence, and they keep answering a single question, over and over: this new kind of subject — why should anyone trust it?
In the LAN era, the question was "who is the person at this machine?" AD/LDAP put every member of an organization into a directory; Kerberos handed them tickets to move freely across the intranet. Identity became enterprise infrastructure for the first time.
In the web era, the question became "why should this app act on my behalf?" SAML carried identity beyond the intranet — single sign-on across organizations and data centers. OAuth then did something quietly radical — it separated authorization from authentication — and OAuth 2.0 made that separation the common standard of the entire web. You could let an app act for you without ever surrendering your password.
In the mobile-and-cloud era, the question was "one me, across countless apps and devices." OIDC completed the authentication layer on top of OAuth 2.0, and "Sign in with ..." became the default front door of the entire internet.
Thirty years, five generations of protocols, each more elegant than the last — even the newest decentralized-identity (DID) experiments still issue credentials to people. They share one assumption, buried so deep almost nobody thinks of it as an assumption at all: the subject is always a human. The directory holds people. The tickets go to people. The grants come from people. The one signing in is a person.
The web has new residents
Now, for the first time in thirty years, that assumption is breaking.
There's a new actor inside companies: the AI agent. It queries data, files requests, calls internal systems — work that used to belong exclusively to employees. It isn't a user, and it isn't an app; it's a third kind of digital subject. Yet the identity stack built for humans has no seat for it. Machine-to-machine credentials do exist — but the assumptions baked into the stack are still human-shaped: one subject, one login, one durable set of permissions.
And an agent simply doesn't grow into that shape. It decides its next step at runtime — which system to touch, which tool to call — based on the context and on what the last tool returned; before a task starts, nobody can fully write down its execution path. Statically pre-granting such a subject a fixed bundle of long-lived permissions will never be enough: whether each step should be allowed has to be judged at the moment that step happens.
So today, most agents act on borrowed identity: an employee's API key, a shared service account, or one over-privileged master credential.
In a demo, none of this shows.
The three questions your security team will ask
The moment an agent heads for production, security puts three questions on the table:
- When something goes wrong, can you tell who did it? A call happened; the log says "user." Was it the person, or an agent acting for them? Which agent? On whose behalf?
- It only needed to do one thing — why does it hold a person's entire permission set? Handing a user credential to an agent hands over everything that user can do, all at once.
- Can you answer "what allowed this call"? Traditional audit logs speak in the grammar of human subjects. Swap in an agent, and the question hangs unanswered.
These aren't tech debt you can defer. They're the ticket price for production.
Academia has already named the problem precisely. Researchers distill the attribution layer of agent infrastructure into three propositions (Infrastructure for AI Agents, Chan et al., 2025, arXiv:2501.10114): Agent IDs — who is this agent; identity binding — which person or organization stands behind it; certification — can its behavior and properties be trusted. Hold those against thirty years of protocol history and a gap appears: OAuth lets a human authorize an app, OIDC lets an app recognize a human — but no widely adopted protocol built for agents yet lets the world recognize one.
And the gap is structural. The same paper runs through the alternatives already at hand: OAuth tokens and API keys can aid attribution, but they are bound to a single service by construction — they cannot link one agent's activity across services, let alone trace a sub-agent back to whoever created it; IP addresses are unstable and can be shared. At the protocol layer, even the newest agent-to-agent protocols (A2A) only answer what an agent can do — the AgentCard handles capability discovery and interop — while who stands behind it, and why it should be trusted is still left hanging.
Qoni's answer: a passport
GenAuth is Qoni's identity layer. It isn't "one more account system" — it's the next generation of the identity stack, completed for agents this time. Its answer fits in one sentence:
Give every agent a passport of its own — the agent holds zero standing permissions, and every capability it exercises comes from an explicit, revocable grant made by a specific person at a specific moment.
Unpack that passport:
- Agent ID: the passport itself. Every agent gets an independent identity and credentials, with a full lifecycle — issuance, rotation, revocation. No more borrowed shadows.
- Identity binding: the issuer on the passport. Every agent is bound to the person and organization behind it, and every action traces back to whoever delegated it. When something goes wrong, it's no longer an unsolved case.
- The delegation chain: the visa pages inside. No new protocol invented — instead, delegation semantics for agents extended along the existing rails of OAuth 2.0 / OIDC: short-lived credentials whose scope only ever narrows, never widens. Your existing identity infrastructure stays; the new layer grows on top of the standards.
One more piece: an agent's capabilities come from its tools. So MCP tool calls fall under the same identity, policy, and audit governance — which tool, in whose name, within what scope, all on the record. And all of it is one SDK away.
The attribution layer's three propositions now have an engineering answer: Agent IDs and identity binding are answered by the passport itself, and certification gets its rails from verifiable grant boundaries and end-to-end audit — whether an agent's behavior can be trusted is no longer a matter of faith, but a matter of record.
Not lending your identity to the agent — letting the agent act as itself, inside boundaries a human has drawn.
The big picture first: an identity hub with no root authority
Put the passport into an architecture, and GenAuth sits as the identity hub between users, agents, and enterprise resources. A user initiates a delegation through an approval flow; GenAuth issues the agent a short-lived, scoped credential on that basis; the agent accesses resources with it; and the whole path emits audit events. The model's first-principles constraint fits in one sentence: an agent owns an identity, but owns no inherent permissions — no root authority. Every permission it ever exercises comes from an explicit delegation by a specific person at a specific moment, revocable at any time.
One detail you can verify on the spot: an agent's dedicated credentials support a full lifecycle — create, rotate, disable, delete — and enabling or retiring an agent's identity depends on no employee account. People come and go; the agent's identity persists and retires on its own.
Authorization that works like a visa
Every grant on that passport behaves like a visa:
- Scoped and time-boxed. Each grant states exactly what it can — and cannot — touch; it expires after an hour by default, and can be as short as a minute. When the task ends, the permission evaporates. Security engineering has a name for this state: zero standing privileges — an agent with no task in hand holds no standing business authority.
- It only ever narrows. To reach a new class of systems, the agent must exchange its grant for a narrower one. However clever the model, it does not get past these two gates — an out-of-scope request is stopped before it ever reaches your business systems.
- Revocable, instantly. The user or an admin can withdraw a grant at any time, and it takes effect immediately — the exact effectivity boundaries get a section of their own below.
- Everything leaves a trail. Every grant, every access, every denial is recorded. Afterwards you can always answer five questions: who, authorized whom, to do what, when, and on what authority. Even the attempted overreach is on the record.
These four visa rules map to GenAuth's four core principles: predictable, governable, revocable, traceable.
Security engineering has a name for this narrow-only design: the principle of least privilege. Game theory has a more intriguing one: a commitment device. The way to make a promise credible isn't to phrase it better — it's to limit your own future options. Scoping and time-boxing every permission an agent holds makes exactly that kind of promise on its behalf. The boundary isn't there because we distrust the agent; the boundary is what makes it trustworthy.
Discipline, minted into the token
The visa analogy is for intuition. The real constraints live at the protocol layer.
Start with the first-principles design. GenAuth's entire permission model compresses into one line of set arithmetic:
An agent's effective permissions = what the human actually holds ∩ what was explicitly delegated ∩ what the enterprise has approved
Three sets, one intersection. It means authority can only narrow as it travels down the chain, never widen (authorization-system design calls this property attenuation; the agent-authorization drafts under discussion at the IETF treat it as a core requirement). The source of all permission is always a person, and what the agent holds is the intersection of three sets — so however capable the model, it is constitutionally incapable of out-ranking the human who delegated it.
The designs below are that formula, enforced at the protocol layer:
A two-token architecture: the delegate token "can exchange, but can't open doors." GenAuth splits authorization and action into two kinds of tokens. When a user approves a delegation, the agent receives a delegate token — its audience points permanently at GenAuth's exchange service (fixed to genauth:token-exchange), never at any business resource. It opens no doors. To reach a resource, the agent must perform an RFC 8693 Token Exchange (the standard grant type urn:ietf:params:oauth:grant-type:token-exchange) and trade it for a short-lived access token valid for exactly one resource — a standard JWT that mainstream gateways verify with their stock JWT / OIDC plugins. Which means: every exchange is a live adjudication. Is the grant still valid, is the scope in bounds, has the credential been disabled — all re-checked at that moment, instead of issuing one long-lived ticket and waving everything through.
Scope attenuation has two gates, plus an allowlist. The scopes requested at exchange must fall simultaneously inside what this delegation granted and what the target resource has registered — crossing either line means rejection — and the exchangeable range is governed by a server-side allowlist: no exchange can ever mint a permission the delegation didn't contain. In the event stream, success and rejection are two distinct audit events (token_exchange.success / token_exchange.rejected): even the scopes that didn't make it are on the record.
The delegate token deliberately has no act. RFC 8693 uses the act (actor) claim to say "who is acting on whose behalf." GenAuth's design discipline: the delegate token doesn't carry it, because at authorization time, no action has happened yet. act is minted only at the moment of exchange, into the access token. And it's an extended structure with a type discriminator — the docs will tell you plainly that a stock RFC 8693 library will silently fail to parse it: validation appears to pass while checking nothing. So the resource side must explicitly check the delegation type, and fail closed. Admitting where we deviate from the standard's default shape, and telling you why you must handle it explicitly — that's what we mean by engineering honesty.
Time-to-live is a first-class citizen. Delegate tokens live from 60 seconds to 24 hours, one hour by default; for single-task delegations we recommend 5 to 15 minutes. And the clock runs on more than one layer: the interactive-authorization window is 10 minutes, the approval session 10 minutes — every layer's window is squeezed to the minimum that step needs. Expiry isn't an exception — it's the norm. The task ends; the permission should end with it.
Consent inherits the OAuth authorization-code discipline. Interactive authorization returns a one-time callback code: the server stores only its hash, consumption happens inside a database transaction, and a state machine guarantees each code is used exactly once. Issuing passports to agents runs on the same security choreography this industry has hardened for over a decade.
Audit is a dual-ID chain. Every delegation mints a grant_id (which authorization) and an audit_id (what happened under it), both generated by GenAuth and embedded in the token itself, traveling wherever it goes. Even an attacker holding a stolen token cannot book their actions under someone else's grant.
And the system's default posture is fail-closed: if the policy service is unreachable, the request is denied. However hard the model hallucinates, it does not cross that line.
Rules in one place, enforcement at the edge
Tokens answer "is this credential trustworthy?" That's only half the problem. The other half: should this particular request go through?
GenAuth follows the classic separation in access control: the policy decision point (PDP) is centralized, the policy enforcement point (PEP) is pushed down. How the rules are written is managed in one place — GenAuth. Where the traffic gets stopped is wherever it arrives: at the gateway edge, or inside the business service.
On the decision side sits a four-layer permission model: roles (RBAC) answer who, policy conditions answer under what circumstances, resource namespaces answer which class of resource, and data permissions answer down to which row. Each layer works alone or stacked. Policy conditions evaluate five operator families — boolean, date, IP, numeric, string — so constraints like "business hours only," "office network only," "within quota only" are expressed as configuration, not code.
For the operations team, the payoff is immediate: tightening a policy means changing no business code and waiting for no release train. Adjust the policy in the console, and newly issued tokens carry the new scope at once (with one honest exception: if your enforcement point is the gateway, its plugin configuration is still yours to update — we'd rather write that down than round it away).
This split also answers a very practical objection: agents move far faster than people, and if every step popped a confirmation dialog, "confirm" would decay into a mindless click within days. GenAuth divides the labor differently: what a human approves is one scoped, time-boxed delegation — not each individual action; every exchange and access inside that delegation is adjudicated by machine against policy in real time, and anything out of bounds is simply rejected. Humans make few, weighty decisions; machines make many, fast ones.
A delegation's life: an object with a lifecycle
In GenAuth, a delegation isn't a config entry — it's an object with a full lifecycle. The agent initiates a request and the delegation sits pending; only when the user signs in on the approval page and confirms (a 10-minute approval window) does it get issued; while in use, the resource side can query its live status via introspection at any moment; it expires on its own, or gets revoked by the user or an admin at any point. And every delegation object records its approver and approval time: "on what authority does this agent hold this permission" always has a definite answer.
"Revocable at any time" is a sentence every identity vendor writes. The engineering question that actually matters is the next one: revoked — effective when? GenAuth puts both boundaries in plain sight:
- Paths validated through introspection or token exchange fail immediately after revocation, because every check goes back to the issuer and reads the delegation's live status;
- Paths that only verify JWT signatures locally have a hard upper bound: the token's own short TTL. The token cannot outlive its next expiry.
Both boundaries are given by design, with no gray zone in between. This is also the deeper reason GenAuth insists on short lifetimes: when a credential leaks, the blast radius is set by the token's lifespan. And even in the worst case, three lines of defense remain: the agent's dedicated credentials can be disabled and rotated instantly; the credentials themselves carry zero business permissions — actual access rides on delegations and exchanged access tokens, all short-lived and revocable; and enforcement-side checks keep running throughout. Trip any one of them, and a leaked credential's usable window collapses to the credential's own short lifetime.
Tools go through security, too
Half of an agent's capability comes from tools, and MCP is a widely adopted protocol for plugging them in. But as tools multiply, a new management black hole opens up: every tool with its own keys, its own logs, and "who may use which tool" scattered across each tool's own configuration.
GenAuth pulls MCP into the same identity plane, and splits management from execution: the management plane lives in GenAuth — instances, templates, OAuth2 configuration, user-to-tool connections, call logs, all explicit objects you can bulk-import or unbind one by one; the execution plane — the gateway actually carrying tool traffic — stays with the gateway you already run. "Which user may connect to which MCP tool" becomes a visible, governable record; and every tool call's four facts (who, which agent, called what, when) flow into the same audit chain as delegations and exchanges.
Two roads into your stack
The most complete passport system is worthless if it can't plug into what you already run. GenAuth offers two integration paths, matching the two shapes agents actually take:
- User-level agents: CLI + Skill. The authorization flow lives outside the agent, in a toolkit: a Skill orchestrates the user's intent, while the CLI handles login, agent identity, user authorization, and short-lived credentials. The agent itself ships zero authorization code and still carries a passport. Built for agents running on a user's machine or inside an agent workbench.
- Enterprise agents: OpenAPI. The authorization flow is internalized into your own business logic: identity, user authorization, credential issuance and verification all happen through direct server-side calls to GenAuth's API. Built for existing applications, backends, and automation platforms.
The only difference between the two roads is where the authorization flow lives — bolted on, or built in. Past the entrance, it's the same permission checks and the same audit trail. Your existing identity foundation stays untouched, too: GenAuth federates with your current IdP over OIDC / SAML — employees keep authenticating against your system, and the agent identity and delegation layer grows on top. Your API gateway keeps its place as the single entry point for agent traffic. Adopting agents doesn't mean rebuilding your infrastructure.
What it looks like inside an enterprise
Enforcement also comes in two shapes — pick the one that matches your architecture:
- The gateway as the enforcement plane. Gateways like APISIX, Kong, or Higress validate the token with their JWT / OIDC plugins, then call GenAuth via forward-auth for a live permission decision, forwarding or rejecting accordingly. An out-of-scope request dies at the gateway — it never touches business logic. Built for companies with a unified entry point that want permissions enforced at the edge.
- The business system as the enforcement plane. Services verify, introspect, and decide in-process via the SDK. Built for teams without a central gateway, or decisions that need to sit close to business logic.
The two shapes also compose: north-south traffic gets stopped uniformly at the gateway, while individual services add data-level decisions in-process via the SDK.
How fine is "fine-grained"? It stacks in two places: inside the token, the audience and permission list are doubly narrowed at issuance — by what the resource registered and by what the user delegated; outside the token, the enforcement point re-checks the agent, the credential, the grant, the data policy, and revocation status live, before every pass. Fail any one condition, and the request dies at the enforcement point without touching business logic.
Here's what one call looks like at runtime:
A typical day in production: an employee asks the internal data assistant, "pull last quarter's sales for the east region." The agent initiates a delegation under its own passport; the employee confirms; the agent exchanges it for a visa scoped to read-only access on the reporting system, valid for fifteen minutes; the gateway checks it and the query runs. Midway, the agent reaches for a customer-privacy field it wasn't granted? That request is rejected at the gateway — and logged. Afterwards, the security team sees one unbroken chain: who authorized, which agent, what it did, when, on what authority — including the overreach that never went through.
"Which people are using AI agents?" — one question, two layers of answers
The first question leadership asks is rarely about protocols. It's this plain one. And it properly splits in two.
The first layer is agent-level: which agent made how many calls, burned how many tokens, at what latency. Your gateway answers this natively: each agent binds one-to-one to a gateway consumer (the caller credential), so per-consumer call volume and consumption is a ready-made dashboard (no central gateway? this layer falls to the business system's access logs, or GenAuth's verification records).
The second layer is person-level: who, when, through which agent, touched what, under what authority. The gateway can't answer this — and shouldn't be asked to: multiple users' delegations can flow into the same agent, and aggregate consumer metrics cannot be split back out to individual people. The person-level answer lives in GenAuth's delegation and audit records: every delegation is, by construction, a structured record of "this person, at this time, put this agent to work within this scope." The two layers share correlation identifiers and can be checked against each other.
Put the layers together, and "which people are using AI agents" has a visualizable answer for the first time: the agent level shows cost and load; the person level shows ownership and boundaries.
Audit: two sources, each vouching for the other
Who, authorized whom, to do what, when, on what authority: the five audit questions draw their answers from two sources that vouch for each other. The authorization side is recorded by GenAuth: delegation approvals (with the approver), exchange successes and rejections, issuance, revocation, policy changes. The execution side is recorded by the gateway's or the business system's access logs: which endpoint was called, when, with what result.
The two sides are recorded independently by different systems, joined by correlation keys like request_id, jti, and grant_id. The value of that design only shows under adversarial conditions: an anomaly on one side leaves the other side's records intact, and tampering with a single behavior record means breaking into two systems at once. Sample any call, and the correlation keys walk you back to complete answers for all five questions. For compliance teams, this chain provides the audit-data foundation for behavioral traceability under regimes like PIPL and GDPR (the compliance assessment itself still belongs to your broader data-governance program).
And every capability above lands as a line item you can check off on a POC acceptance sheet:
- A valid credential requesting outside its scope is rejected at the enforcement point, with a record;
- After a user revokes a delegation, introspection-validated paths fail immediately;
- After a policy change, newly issued credentials carry the new scope at once, with no business-service redeploy;
- Sample any single call, and request_id / jti walk you back to complete answers for all five questions;
- Pick any employee and any time window, and you can list every delegation they granted and the agent activity under each.
The three things enterprises actually evaluate an agent platform on now each have a section of their own: usage accounting (the two-layer answer), fine-grained permissions (the PDP / PEP four-layer model), and audit traceability (dual sources, five questions).
This isn't a concept
The identity system is already written up in 37 pages of official documentation, in English and Chinese — concepts, architecture, integration guides, enterprise scenarios. The questions security reviews ask most often already have their own chapters.
One quick-reference table to gather everything this piece has covered:
| Capability | In one sentence |
|---|---|
| Independent agent identity | Dedicated credentials with a full lifecycle: create / rotate / disable / delete |
| Dynamic delegation | Explicit approval, layered TTLs, revocable anytime, traceable to the approver |
| Token Exchange / OBO | RFC 8693 standard protocol; authority only narrows; both outcomes audited |
| Fine-grained authorization | RBAC + conditional policies + resource namespaces + data permissions, PDP / PEP split |
| MCP governance | Management plane for instances / templates / user connections; execution on your gateway |
| API / SDK enforcement | Services integrate directly: verify, introspect, decide live — no gateway required |
| The audit chain | Dual sources (authorization events + execution logs), five questions answered, denials recorded |
| Enterprise identity foundation | OIDC / OAuth 2.0 / SAML / LDAP, SSO, MFA, org structures — the full enterprise kit |
GenAuth is in private build and will roll out with Qoni in phases — you can join the waitlist on the website.
You shouldn't have to choose
Companies shouldn't have to choose between letting agents work and holding the security line.
Every time identity technology answered "why should this new subject be trusted," the world gained a new layer of productivity: directories and tickets carried the enterprise intranet, SAML and OAuth carried SaaS and open platforms, OIDC carried the mobile internet. This time, it's the agent's turn.
Don't lend your agent the keys. Issue it a passport you can revoke at any time.
Identity technology took thirty years to get here. This time, the subject is finally the agent.
每一代身份协议,都在回答同一个问题
身份技术写了三十年。如果把这三十年压缩成一句话,它反复回答的其实是同一个时代命题:这个新出现的主体,凭什么被信任?
局域网时代,问题是"这台机器前坐着的人是谁"。AD/LDAP 把组织里的每个人放进目录,Kerberos 用票据让他们在内网里自由通行;身份第一次成为企业的基础设施。
Web 时代,问题变成"这个应用凭什么代表我"。SAML 把身份带出了内网,单点登录横跨供应商与数据中心;OAuth 则把"授权"从"认证"里分离了出来,OAuth 2.0 让它成为整个 Web 的通用标准:你可以让一个应用替你做事,而不必交出你的密码。
移动与云的时代,问题是"同一个我,怎么横跨无数应用与设备"。OIDC 在 OAuth 2.0 之上补全了认证层,让"用某某账号登录"成了整个互联网的默认动线。
三十年,五代协议,一次比一次优雅;连最新的去中心化身份(DID)试验,也还是在为人发证。它们有一个共同的预设,藏得很深,深到几乎没人把它当成一个"设定":主语始终是人。 目录里的是人,票据发给人,授权出自人,登录的还是人。
网络上出现了新的居民
现在,这个三十年没变过的预设,第一次被打破了。
公司里多了一类新的角色:AI Agent。它替人查数据、发流程、调系统,做着过去只有员工才能做的事。它不是用户,也不是应用,而是第三种数字主体。可是在为人设计的账号体系里,没有它的位置。机器对机器的凭证当然存在,但整套技术栈的预设仍然是"人形"的:一个主体、一次登录、一套长期有效的权限。
而 Agent 恰恰长不成这个形状。它在运行时才根据上下文和上一步工具的返回,决定下一步访问哪个系统、调用什么工具:任务开始之前,往往没有人能完整写出它的执行路径。给这样一个主体静态地预授一包长期权限,注定不够用;每一步该不该放行,得在那一步发生时再判断。
于是今天绝大多数 Agent,都在"借用"人的身份行动:拿员工的 API Key,用共享的服务账号,或者干脆揣着一把权限很大的万能钥匙。
Demo 阶段,这一切看不出问题。
安全部门一定会问的三个问题
一旦要上生产,安全团队会把三个问题摆到桌上:
- 出了事,说得清是谁干的吗? 一次调用发生了,日志里只有"用户"两个字:是本人操作,还是 Agent 代办?是哪个 Agent?代表谁?
- 它只需要做一件事,为什么拿到了一个人的全部权限? 把用户凭证直接交给 Agent,等于把这个人能做的所有事,一次性交了出去。
- "这次操作凭什么被允许",答得上来吗? 传统审计日志的主语是人。行动者换成 Agent 之后,这个问题就悬空了。
这三个问题不是可以往后放的技术债。它们是 Agent 走进生产环境的门票。
学术界已经把这件事说得很清楚。研究者把 Agent 基础设施的"归因(Attribution)"层归纳为三个命题(Chan 等,《Infrastructure for AI Agents》,2025,arXiv:2501.10114):Agent ID,这个 Agent 是谁;Identity Binding,它背后站着哪个人、哪个组织;Certification,它的行为与属性是否可信。对照三十年协议史你会发现一个空白:OAuth 让人授权给应用,OIDC 让应用认识人,但还没有一个为 Agent 而生、被广泛采用的协议,让世界认识一个 Agent。
而且这个空白是结构性的。同一篇论文逐一检验过手头现成的替代品:OAuth 令牌与 API Key 能辅助归因,但它们天生绑定单个服务,串不起同一个 Agent 在不同服务上的行为,更追不到子 Agent 背后的创建者;IP 地址则既不稳定、又可能被共享。在协议层,就连最新的 Agent 间通信协议(A2A)也只回答了"这个 Agent 能做什么":AgentCard 解决的是能力发现与互操作,"它背后是谁、凭什么被信任"依然悬着。
Qoni 的回答:一本护照
GenAuth 是 Qoni 的身份层。它做的不是"再加一套账号系统",而是把身份技术的下一代协议栈,为 Agent 补上。它的答案,一句话就能讲完:
给每个 Agent 发一本自己的"护照":Agent 本身没有任何权限,它做每件事的权限,都来自某个人在某个时刻的明确授权,而且随时可以收回。
拆开看:
- Agent ID:护照本身。 每个 Agent 拥有独立身份与凭据,注册、轮换、吊销的完整生命周期,不再是借来的影子。
- Identity Binding:护照上的签发人。 每个 Agent 都与它背后的人和组织完成绑定,每一个行为都能归因到委托它的那个人;出了事,不再是无主悬案。
- 委托授权链:护照里的签证页。 不发明新协议,而是在 OAuth 2.0 / OIDC 的既有轨道上延伸出面向 Agent 的委托语义:凭证短时效,范围只收窄、不放大。你现有的身份基础设施不用推倒重来,新的一层长在标准之上。
还有一块拼图:Agent 的能力来自工具。所以 MCP 工具调用也被纳入同一套身份、策略与审计治理:Agent 用哪个工具、以谁的名义、在什么范围内,全部有据可查。所有这些,一套 SDK 接入。
归因层的三个命题,至此有了工程答案:Agent ID 与 Identity Binding 由护照直接补齐;Certification 则由可验证的授权边界与全程审计铺轨,行为是否可信,不再靠自觉,而是有据可查。
不是把人的身份借给 Agent 用,而是让 Agent 以自己的身份、在人划定的边界内行动。
全景先行:不持有 root authority 的身份枢纽
把护照放进架构里看:GenAuth 在用户、Agent 与企业资源之间充当身份枢纽。用户经审批流程发起委托,GenAuth 据此为 Agent 签发短时效、范围受限的凭证,Agent 持凭证访问资源,全过程产生审计事件。而整个模型的第一性约束只有一句话:Agent 拥有独立身份,但不拥有固有权限(root authority)。 它每一次行动的权限,都来自某个人在某个时刻的显式委托,并且随时可以被收回。
一个可以当场验证的细节:Agent 的专属凭据支持创建、轮换、禁用、删除的完整生命周期管理,它的启用与回收,不依赖任何员工账号。人来人走,Agent 的身份独立存续、独立注销。
授权,像签证一样运转
这本护照上的每一次授权,都像一张签证:
- 有范围,有期限。 每张"签证"都写清楚能访问什么、不能访问什么;默认一小时后过期,最短只有一分钟。任务做完,权限自动消失。安全工程里管这个状态叫零常驻权限(zero standing privileges):没有任务在身的 Agent,不保有任何常驻的业务权限。
- 越换越小,不会变大。 Agent 每要访问一类新系统,都要用手里的授权去"换一次签证",新签证的范围只会比原来更小。无论它多聪明,都绕不过这两道闸门:越权的请求在抵达业务系统之前,就已经被拦下。
- 随时可以吊销。 用户或管理员任何时候都能收回授权,收回立刻生效;生效的两条边界,下文有一节单说。
- 全程留痕。 每一次授权、每一次访问、每一次被拒绝,都留下记录。事后永远能回答五个问题:谁、授权给谁、做了什么、什么时候、凭什么。 连那次"未遂"的越权尝试,也记录在案。
这四条签证规则,对应着 GenAuth 的四个核心理念:可预期、可管控、可撤销、可溯源。
而这套"只收窄、不放大"的设计,在安全工程里叫最小权限原则;在博弈论里,它还有一个更耐人寻味的名字:承诺机制(commitment device)。让一个承诺变得可信的办法,不是把话说得更漂亮,而是主动限制自己未来的选择。给 Agent 的每一份权限装上范围和期限,正是替它做出了这种承诺。上边界,不是因为不信任它;恰恰是边界,让它变得可以被信任。
把纪律做进令牌里
签证的类比讲的是感觉,真正的约束力在协议层。
先立第一性设计。GenAuth 的整个权限模型,可以压缩成一行交集公式:
Agent 实际权限 = 人的真实权限 ∩ 显式委托范围 ∩ 企业批准边界
三个集合求交集,意味着权限沿着链条传递时只能收窄、永远不能放大(这个性质在授权系统设计里叫 attenuation,IETF 讨论中的 Agent 授权草案把它列为核心属性)。权限的源头永远是人,Agent 拿到的是三个集合的交集:所以无论模型多强,它天生不可能比委托它的那个人权限更大。
下面这些设计,就是这条公式在协议层的落实:
双令牌架构:委托令牌"只能换、不能开门"。 GenAuth 把"授权"和"行动"拆成两种令牌。用户批准委托后,Agent 拿到的是委托令牌:它的受众(audience)恒定指向 GenAuth 的兑换服务(固定为 genauth:token-exchange),不指向任何业务资源,拿着它敲不开任何一扇门。要访问资源,必须先做一次 RFC 8693 Token Exchange(标准授权类型 urn:ietf:params:oauth:grant-type:token-exchange),换出一张只对单个资源有效的短时效访问令牌:它是标准 JWT,主流网关的 JWT / OIDC 插件按配置就能验签。这意味着:每一次兑换,都是一次实时裁决。授权是否仍然有效、范围是否越界、密钥是否已被停用,都在这一刻重新检查,而不是发一张长票就放行到底。
scope 收窄有两道闸门,外加一张白名单。 兑换时请求的范围,必须同时落在"这次委托授予的范围"与"目标资源注册的范围"之内,任何一边越界都直接拒绝;可兑换的范围还由服务端白名单管控,Agent 无法通过交换获得委托之外的任何权限。在事件流里,成功与被拒是两类独立的审计事件(token_exchange.success / token_exchange.rejected):连没通过的那部分 scope,也被记录在案。
委托令牌里刻意没有 act。 RFC 8693 用 act(actor)声明"谁在代表谁行动"。GenAuth 的设计洁癖在于:委托令牌里没有它,因为授权发生时,行动还没有发生;act 只在兑换那一刻,随访问令牌铸入。而且这个 act 是带类型判别字段的扩展结构,文档会直白地告诉你:用现成的 RFC 8693 库解析它会"静默取不到值",看起来校验通过了,实际什么都没校验,所以资源侧必须显式判断 Agent 委托类型,宁可 fail-closed。承认偏离了标准的默认形状,并告诉你为什么必须显式处理,这是我们理解的工程诚实。
时效是一等公民。 委托令牌的有效期从 60 秒到 24 小时,默认一小时;对单个任务的委托,我们建议 5 到 15 分钟。而且时效不止一层:交互授权的窗口 10 分钟,审批会话 10 分钟,每一层的时间窗都压到完成这一步所需的最小值。过期不是异常,是常态:任务做完,权限理应消失。
授权确认沿用 OAuth 授权码的纪律。 交互式授权返回的是一次性回调 code:服务端只存它的哈希,消费发生在数据库事务里,状态机保证一张 code 只能用一次。给 Agent 发护照,用的还是这个行业锤炼了十几年的那套安全动作。
审计是双 ID 链。 每次委托生成 grant_id(哪一次授权)与 audit_id(这次授权之后发生了什么),两个 ID 由 GenAuth 生成并直接铸进令牌本身,随令牌流转。攻击者即使偷到令牌,也无法把行为记到别的授权名下。
而整套体系的兜底姿态是 fail-closed:策略服务不可用时,请求直接被拒。模型再怎么幻觉,也越不过这道边界。
规则集中,执行下沉
令牌回答的是"凭证是否可信",还有另一半问题:这一次请求,到底该不该放行?
GenAuth 的鉴权体系遵循访问控制的经典分层:策略决策点(PDP)集中,策略执行点(PEP)下沉。 规则怎么定,在 GenAuth 一处管理;流量怎么拦,在网关边缘或业务服务内就地执行。
决策端是四层叠加的权限模型:角色(RBAC)回答"是谁",策略条件回答"什么情况下",资源命名空间回答"对哪类资源",数据权限回答"到哪一行数据"。四层可以单独用,也可以叠加。策略条件支持布尔、日期、IP、数值、字符串五类判断:"仅工作时段""仅办公网段""仅额度内"这类约束,用配置表达,不用写代码。
对运维团队,这个分层有一个立竿见影的好处:收紧一条策略,不用改业务代码,不用等发版排期。 策略在控制台调整,新签发的令牌即时携带新范围(若执行点在网关侧,插件配置的调整除外:这一处例外,我们也照实写在这里)。
这个分层还顺带回答了一个很现实的反对意见:Agent 的动作比人快得多,如果每一步都要人点一次确认,用不了几天,"确认"就会沦为无脑点击的仪式。GenAuth 的分工是:人批准的是一张有范围、有期限的委托,而不是逐次批准每一个动作;委托之内的每一次兑换与访问,由机器按策略实时裁决,越界直接拒绝。人做的决定少而重,机器做的裁决多而快。
委托的一生:一个有生命周期的对象
在 GenAuth 里,"委托"不是一条配置,而是一个有完整生命周期的对象。Agent 发起委托请求,进入待审批;用户在审批页面登录并确认(审批窗口 10 分钟),委托才被签发;使用期间,资源方随时可以通过 introspect 查询它的实时状态;到期自动消亡,或者在任何时刻被用户或管理员撤销。而且每个委托对象都记录着具体的授权人与审批时间:"这个 Agent 凭什么有这个权限",永远有确定答案。
"随时可以吊销",是所有身份产品都会写的一句话。工程上真正要紧的是下一句:吊销之后,多久生效? GenAuth 把两条边界都写在明面上:
- 经 introspect(凭证内省)或令牌兑换校验的链路,撤销后立即失败:因为每一次校验都会回到签发方,核对委托的实时状态;
- 仅做本地验签的 JWT 链路,失效上界是凭证自己的短时效 TTL:令牌活不过下一次过期。
两条边界都由设计明确给出,不含模糊地带。这也是 GenAuth 坚持短时效的深层原因:凭证泄露时的爆炸半径,由令牌寿命决定。 就算最坏的情况发生,也有三道防线:Agent 的专属凭据可以即时禁用与轮换;凭据本身不携带任何业务权限,实际访问依赖的委托和兑换所得的访问令牌都是短时效且可撤销的;执行点侧的校验仍在持续生效。任何一道触发,泄露凭据的可用窗口都会被压进凭证自身的短时效之内。
工具也要过安检
Agent 的能力一半来自工具,MCP 是当前被广泛采用的工具接入协议。但工具一多,新的管理黑洞就出现了:每个工具各配各的密钥、各留各的日志,"谁能用哪个工具"散落在一个个工具自己的配置里。
GenAuth 把 MCP 纳入同一个身份平面,并且把管理与执行切开:管理面在 GenAuth,实例、模板、OAuth2 配置、用户与工具的连接关系、调用日志,都是显式的管理对象,支持批量导入、逐个解绑;执行面交给企业已有的网关承载工具流量。"哪个用户可以连哪个 MCP 工具",从此是一条看得见、管得住的连接记录;工具调用的四要素(谁、哪个 Agent、调了什么、何时)与委托、兑换事件汇入同一条审计链。
两条路,接进你的系统
护照体系再完整,接不进现有系统就只是纸上谈兵。GenAuth 留了两条接入路径,对应两类 Agent 的真实形态:
- 用户级 Agent,走 CLI + Skill。 授权流程整个"外挂"在工具包里:Skill 负责编排用户的意图,CLI 负责登录、Agent 身份、用户授权和短时效凭证。Agent 本体不用内建任何授权能力,就能持照上岗。适合跑在用户本地和 Agent 工作台里的 Agent。
- 企业级 Agent,走 OpenAPI。 把授权流程"内化"进自己的业务流程:身份、用户授权、凭证的签发与校验,都由服务端直接调用 GenAuth 的 API 完成。适合已有应用、服务端和自动化平台。
两条路的差别,只在授权流程放在哪里:一个外挂,一个内化。走进去之后,是同一套权限判断、同一条审计链路。企业已有的身份底座也不用动:GenAuth 以 OIDC / SAML 联邦方式接入现有 IdP,员工身份仍由你的系统认证,Agent 的身份与委托层长在它之上;已有的 API 网关继续作为 Agent 流量的统一入口。引入 Agent,不必重造一遍基础设施。
在企业里,它长这样
执行点同样有两种形态,按你的架构选:
- 网关作为执行平面。 APISIX、Kong、Higress 这类网关用 JWT / OIDC 插件完成令牌基础校验,再经 forward-auth 向 GenAuth 请求实时权限判断,按结果放行或拒绝。越权的请求在网关就被拦下,根本不触达业务逻辑。适合已有统一入口、希望权限在边缘收口的企业。
- 业务系统作为执行平面。 服务内直接用 SDK 验签、内省、实时判断。适合没有统一网关、或需要贴着业务做细粒度决策的场景。
两种形态还可以并存:南北向流量走网关统一拦截,个别系统在服务内用 SDK 补充数据级判断。
权限的"细",体现在两处叠加:令牌之内,受众与权限清单在签发那一刻,就被资源注册的能力范围与用户的委托双重收窄;令牌之外,执行点每次放行前再实时查一遍 Agent、凭据、委托、数据策略与撤销状态。任何一个条件不满足,请求就在执行点被拒,不触达业务逻辑。
一次调用在运行时长这样:
一个典型的落地故事:员工对内部数据助手说"帮我拉一下上季度华东区的销售数据"。Agent 用自己的护照发起委托,员工确认授权,Agent 换到一张只覆盖报表系统只读权限、十五分钟有效的签证,经网关校验后完成查询。中途它顺手想访问客户隐私字段?那个请求在网关被拒,并且记录在案。事后安全团队看到的是一条完整链路:谁授权、授权给哪个 Agent、做了什么、什么时候、凭什么,连那次未遂的越权也在。
"哪些人在用 AI Agent":一个问题,两层答案
管理层最先问的往往不是协议,而是这个朴素的问题。它其实要拆成两问来答。
第一问是 Agent 级:哪个 Agent 发生了多少调用、消耗了多少 token、延迟如何。这一层网关原生就能答:每个 Agent 与网关的 consumer(调用方凭据)一比一绑定,按 consumer 维度出调用量与消耗,就是现成的仪表盘(没有统一网关的企业,这一层由业务系统的访问日志或 GenAuth 的校验记录承担)。
第二问是人级:谁、在何时、通过哪个 Agent、以什么权限访问了什么。这一层网关答不了,也不该由它答:多个用户的委托可以汇入同一个 Agent,网关的聚合指标无法反向拆分到人。人级的答案在 GenAuth 的委托与审计记录里:每一条委托,天然就是一条"某人在某时把某个 Agent 用于某个范围"的结构化记录。 两层数据共享同一组关联标识,可以相互核验。
把两层合起来,"哪些人在用 AI Agent"第一次有了可视化的答案:Agent 级看成本与负载,人级看归属与边界。
审计:两个源头,互相作证
谁、授权给谁、做了什么、什么时候、凭什么:审计五问的答案,来自两个互相作证的源头。授权侧由 GenAuth 记录:委托审批(含授权人)、兑换的成功与拒绝、签发、撤销、策略变更。执行侧由网关或业务系统的访问日志记录:调了什么接口、何时发生、返回什么结果。
两侧由不同的系统独立记录,靠 request_id、jti、grant_id 这类关联键相互连接。这个设计的价值在对抗性场景里才显出来:单侧异常,不影响另一侧记录的独立性;想篡改一条行为记录,需要同时改动两个系统。抽样任何一次调用,都能顺着关联键回溯出五问的完整答案。对合规团队,这条链为个人信息保护法、GDPR 等法规场景下的行为可追溯要求,提供了审计数据基础(合规评估本身,仍需结合企业整体的数据治理开展)。
而以上所有能力,最后都能落成 POC 验收单上可以打钩的条目:
- 持合法凭证但请求 scope 之外的资源,请求在执行点被拒,并留下记录;
- 用户撤销委托后,走 introspect 的链路立即失败;
- 策略调整后,新签发的凭证即时携带新范围,业务服务无需重新发布;
- 抽样任何一次调用,能通过 request_id / jti 回溯出五问的完整答案;
- 给定任意一名员工与一个时间段,能列出他这段时间授权过的全部委托,以及对应的 Agent 行为汇总。
企业评估 Agent 平台时最关心的三件事,到这里正好各有一节作答:使用统计(双层口径)、细粒度权限(PDP / PEP 四层模型)、审计追溯(双源五问)。
这不是概念
这套身份体系已经写成了 37 页中英双语的官方文档:概念、架构、接入指南、企业场景,全部就绪。安全团队评估时最常问的那些问题,文档里都有对应的章节。
一张速查表,收拢全文讲过的能力:
| 能力 | 一句话说明 |
|---|---|
| Agent 独立身份 | 专属凭据,创建 / 轮换 / 禁用 / 删除全生命周期管理 |
| 动态权限委托 | 显式审批、TTL 分层、随时撤销、可追溯到授权人 |
| Token Exchange / OBO | RFC 8693 标准协议,权限逐级收窄,交换双向审计 |
| 细粒度鉴权 | RBAC + 条件策略 + 资源命名空间 + 数据权限,PDP / PEP 分离 |
| MCP 治理 | 实例 / 模板 / 用户连接的管理面,执行面对接你已有的网关 |
| API / SDK 集成鉴权 | 业务系统直接集成,验签、introspect、实时判断,不依赖网关 |
| 审计链 | 授权侧事件 + 执行侧日志双源,五问可答,拒绝也留痕 |
| 企业身份底座 | OIDC / OAuth 2.0 / SAML / LDAP、SSO、MFA、组织架构等企业级能力 |
GenAuth 目前处于 private build,将随 Qoni 分阶段开放,可以在官网加入 waitlist。
不必二选一
企业不需要在"让 Agent 干活"和"守住安全底线"之间二选一。
身份技术每一次回答"新主体凭什么被信任",世界就多出一层新的生产力:目录与票据支撑起企业内网,SAML 与 OAuth 撑起了 SaaS 与开放平台,OIDC 撑起了移动互联网。这一次,轮到 Agent 了。
不是把你的钥匙借给 Agent,而是给它发一本随时可以吊销的护照。
身份技术走了三十年。这一次,主语终于是 Agent。
