Live prices are currently unavailable — the exchange feed could not be reached and no recent cached reading is held.

Research · ICP

Internet Identity and the principal model

Internet Identity is the network's native authentication system. There is no username, no password and no email address: a user signs in with a passkey or an OpenID account, and the application receives a principal that is unique to it. The design is as much about what the application cannot learn as about what it can.

Last reviewed 2026-09-21Source: ICP Developer Docs — Internet Identity and the Internet Identity specificationThe authentication flow and delegation model are described as documented; the identity provider URL is injected by the deployment environment and is not hardcoded here.

Anonymous identity

Internet Identity issues no personal data to the application. There is no name, no email address and no password stored on the application's side. The user authenticates to the identity provider with a passkey — a WebAuthn credential held by their device — or with an OpenID account, and the application receives only a principal: an opaque identifier that stands for the user in that application.

The documentation describes the principal as derived per frontend origin. A user who signs into one application gets a different principal than the same user signing into another, even with the same passkey. This is the property that prevents applications from correlating users across services, and it is a deliberate design choice rather than an incidental one. An application cannot build a cross-service profile because it never sees an identifier that is shared between services.

The trade-off is worth stating. A principal is not a portable account: a user who loses access to their passkey and recovery material loses access to the principal, and an application that wants to recognise the same person across two of its own origins must configure that explicitly. The documentation covers the alternative-origins mechanism for exactly that case.

Passkeys and WebAuthn

A passkey is a WebAuthn credential. The private key is generated and held by the user's device or platform authenticator, and it never leaves it. Authentication is a signature over a challenge, which means there is no shared secret for a server to store and no password to phish. The documentation notes that the identity provider also supports OpenID accounts from major providers, and that the authentication method used is reported back to the application.

The specification distinguishes passkeys from temporary key or PIN identities, which are less secure and generally live only in a browser database. An application can indicate whether it will accept the weaker method, and the documentation recommends against it for anything that matters. That is a useful reminder that the security of the flow depends on which authenticator the user chose, not only on the protocol.

Recovery is the part of any passkey system that deserves scrutiny. The identity provider supports recovery phrases and recovery devices, and the documentation is explicit that losing access to every registered authenticator and recovery method means losing the identity. There is no support desk that can restore it, because there is no account record to restore.

Delegation chains

The application does not sign every request with the user's passkey. Instead, the frontend generates a session key pair, and the identity provider issues a delegation that authorises that session key to sign on behalf of the user's identity. The documentation describes the client delegation as signed by the identity provider's canister and carrying a maximum lifetime, with a shorter default. The application then signs its canister calls with the session key, and the network verifies the delegation chain.

A delegation chain can be longer than one link. The specification describes an intermediate delegation from the security device's key to a session key managed by the identity frontend, so that the device is not invoked for every signature. It also describes a pattern for mobile applications in which a proxy frontend holds an intermediate key and issues a second delegation to the mobile app's key, with the chain returned over an app link or a URI fragment.

The documentation is careful about the trust this creates. An intermediate key can impersonate the user, so it must be handled confidentially and should be short-lived. The specification also advises clients to support chains longer than one link and delegations with target restrictions, so that a future version of the protocol does not break them.

Principals and the caller

Every canister call carries a caller principal, and the backend reads it from the protocol rather than from an argument. The documentation is emphatic on this point: the principal is not passed as a function parameter, because a parameter can be forged by whoever constructs the call. The backend reads the caller from the message context, and any access control is enforced there.

That is the same pattern Bitcoin uses in a different form. A Bitcoin script authorises a spend by checking a signature against a public key; a canister authorises an action by checking the caller principal against a stored list. In both cases the authorisation is derived from the message itself rather than from data the sender supplies alongside it. The canisters page covers the message model that carries the caller.

The documentation also notes a common failure mode: an application that reads the identity before the sign-in flow has resolved will see the anonymous principal, which is a valid principal that represents no user. Treating it as a signed-in user is a bug, and the fix is to wait for the flow to complete rather than to special case the value.

Sources and references

The authentication flow, the delegation model and the principal derivation are described from the Internet Computer's own documentation and from the published Internet Identity specification.

  • Internet Identity and principal-per-app isolation. ICP Developer Docs, Internet Identity: describes passkey and OpenID sign-in, the delegation flow, and the caller principal being read from the protocol.
  • The delegation chain and its lifetime. Internet Computer, Internet Identity specification: specifies the client delegation, the identity frontend delegation and the authentication protocol methods.
  • Identity, access control and delegation expiry. ICP Developer Docs, Identity and access management: explains how the caller principal is read and why access control must be enforced in the canister.