Agent Harness intercepts tool calls and determines if human confirmation is needed.
Examples: Claude Code / A2H
Pros:
Cons:
Resource Server issues WWW-Authenticate challenge. Client replays challenge to Auth Server. Auth Server contacts user.
Pros:
Cons:
We are primarily interested in Domain Harness Managed HITL
OpenID Connect Client-Initiated Backchannel Authentication checks many boxes:
CIBA flow
The parts that work well for HITL:
This is exactly what we want. But...
The client decides when CIBA is required. The server has no way to signal it.
There's no mechanism for the AS to say, in response to a normal token request:
"Actually, I need human approval before I can issue this token. You need to wait a minute."
The client must know in advance that CIBA is the right thing to do, and once CIBA is initiated the user must be contacted.
What if the server wants to decide when HITL is required dynamically, based on risk, policy, or context?
CIBA is an OIDC extension, not an OAuth extension. It's optimized for authenticating a user, not requesting authorization to a resource.
The client must tell the AS who to send the notification to:
id_token_hint (a previously issued ID token)login_hint (an email, phone number, etc.)login_hint_tokenThe server cannot choose who to route the approval based on the request context.
With CIBA, the client must already know who that owner is and have an identifier for them. But often:
CIBA can't model any of this.
Ideal flow
| CIBA | What we want | |
|---|---|---|
| Who decides HITL is needed? | Client | Server |
| Who initiates? | Client | Server |
| Who picks the approver? | Client | Server |
| Which grant types? | CIBA grant only | Any |
That "something" is not constrained to be a single user that the client names. This unlocks:
None of this is possible when the client picks the approver.
Some CIBA implementations pepper the end user with individual approvals - one per unique request.
This leads to consent fatigue and increases the risk of a user approving a request they shouldn't.
CIBA is optimized for short-lived interactions notifying a specific user. By breaking this model we unlock:
Example: Client Credentials
Example: Token Exchange
Example: Refresh Token
We care about HITL for agents, but it turns out this pattern is generally useful.
Some banking patterns require deferral for auth_code flows today.
A user initiates a high-risk transaction at their bank.
The OP notices unusual behavior and decides to defer until further verification is complete.
Verification may involve:
The user does not need to remain in the banking application.
Transaction processing continues in the background as soon as a decision is made.
This can take minutes to hours.
Many jurisdictions lack widespread digital identity. Identity verification relies on scanning physical documents (passport, driver's license) plus a liveness check.
Usually automated systems handle this. Sometimes a human operator must manually verify. This takes a long time and may involve contacting the user via another channel.
The RP can continue with steps that don't require completed verification, and notify the user when the final decision lands. Compliant with regulation on automated decision-making.
Already an OIDF draft: openid-deferred-token-response-1_0.
It introduces response_type=deferred_code for auth_code flows that need arbitrary time to complete.
We're generalizing this: not just a new response type, but a pattern that applies to any /token response.
Significant overlap with draft-parecki-oauth-jwt-grant-interaction-response as well.
DTR describes how the AS notifies the Client during an approval workflow.
There is no standard for cases where the AS wants to route the approval to a separate system (ServiceNow, Okta Engine).
draft-mcguinness-authzen-access-request-latest in AuthZen WG seeks to address this gap.
This draft describes a common standard for requesting access from a workflow engine.