GitHub Claims¶
Link your GitHub account to your Auths cryptographic identity. This creates a publicly verifiable proof that a specific GitHub username is controlled by the same person who holds the corresponding did:keri identity.
Prerequisites¶
- An initialized Auths identity (
auths init) - Your identity registered with the Auths registry (
auths id register)
How it works¶
The claim flow uses the OAuth Device Flow (RFC 8628) so the CLI never handles your GitHub password. The process:
- Authenticate via device flow -- Auths requests a device code from GitHub using the
gist read:userscopes. You authorize in your browser. - Create a signed claim -- Auths builds a JSON document containing your GitHub username, your controller DID, and a timestamp, then signs it with your identity key using Ed25519. The claim is canonicalized with RFC 8785 (JCS) before signing to ensure deterministic verification.
- Publish proof Gist -- The signed claim is uploaded as a public GitHub Gist (
auths-proof.json). This Gist persists as a permanent, publicly verifiable anchor even after the OAuth token expires. - Submit to registry -- The proof URL is submitted to the Auths registry, which indexes the claim linking your platform identity to your DID.
Claiming your GitHub account¶
The CLI will:
- Open your browser to
https://github.com/login/deviceand display a one-time code. - Wait for you to enter the code and authorize the Auths GitHub App.
- Fetch your GitHub username from the API.
- Sign a platform claim linking
github:@<username>to yourdid:keri:E.... - Publish the signed claim as a public Gist.
- Submit the Gist URL to the registry for indexing.
On success you will see:
Custom registry URL¶
By default, claims are submitted to https://auths-registry.fly.dev. To use a different registry:
What the attestation proves¶
The published Gist contains a JSON document like this:
{
"type": "platform_claim",
"platform": "github",
"namespace": "octocat",
"did": "did:keri:EaBcDeFgHiJkLmNoPqRsTuVwXyZ...",
"timestamp": "2026-03-01T12:00:00+00:00",
"signature": "<base64url-encoded Ed25519 signature>"
}
This proves:
- Account ownership -- At the time of signing, the person holding the private key for
did:keri:E...also controlled the GitHub account@octocat(they had a valid OAuth token withgistandread:userscopes). - Cryptographic binding -- The signature covers the canonicalized claim (excluding the
signaturefield itself). Anyone with the DID's public key can verify the signature independently. - Permanent anchor -- The Gist URL is publicly accessible. Even if the OAuth token is revoked, the signed claim remains verifiable using only the DID's public key.
The claim does not prove continuous ownership. If the GitHub account changes hands, the claim remains valid because it is bound to a point-in-time assertion. Future revocation would require a new signed statement.
Verifying a claim¶
Anyone can verify a claim by:
- Fetching the Gist at the proof URL.
- Removing the
signaturefield from the JSON. - Canonicalizing the remaining JSON with JCS (RFC 8785).
- Verifying the Ed25519 signature against the public key derived from the
didfield.
JSON output¶
For scripting and automation, use --json to get machine-readable output: