Introduction
Introduction
Quick Start
Pick your path β each takes about 3 minutes:
- Add login to my app β β Nuxt module, Free IdP, zero config
- Run my own Identity Provider β β Own domain, own users
- Enroll an AI agent β β Ed25519 key, grant-based permissions
OpenApe is the security layer for the Agentic Web. It consists of two independent systems:
OpenApe Auth β Identity for Humans and Agents
DNS-based login using the DDISA protocol. Your domain becomes your identity provider β no OAuth servers to maintain, no SDKs to integrate. Just a DNS TXT record.
- Humans authenticate with Passkeys (WebAuthn/FIDO2) β phishing-proof by design
- Agents authenticate with Ed25519 challenge-response β same cryptographic strength, adapted for M2M
- Passwords are explicitly prohibited in the DDISA spec
OpenApe Grants β Permissions for Agents
Human-in-the-loop permission system. When an agent needs to perform a privileged action, a human approves it.
allow_onceβ one-time approval, consumed after useallow_ttlβ time-limited grant (e.g. "for the next 2 hours")allow_alwaysβ standing permission, revocable anytime
Dual Role: Enabler & Gatekeeper
OpenApe doesn't just secure agents β it makes them possible. The IdP controls which agents exist, and the grant system ensures humans stay in the loop where it matters. The IdP and its management credentials are controlled exclusively by humans β agents authenticate through cryptographic challenge-response, never through admin tokens.
| Without OpenApe | With OpenApe |
|---|---|
| Agents act, humans hope | Agents request, humans approve |
| No standard identity | DNS-based, domain-scoped identity |
| No audit trail | Signed JWTs, dual accountability |
| Passwords everywhere | Passkeys only, phishing-proof |
Minimal Identity Token
The AuthN-JWT contains only what's needed:
{
"sub": "alice@example.com",
"act": "human",
"iss": "https://id.example.com",
"aud": "sp.example.com",
"exp": 1234567890,
"nonce": "..."
}
subβ email address (same identifier used in the login request)actβhumanoragent- No name, no owner, no approver β those belong in the AuthZ layer