Adopt `alsoKnownAs` for identity verification via DID documents
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 20/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Stack tecnologico
- typescript
- Ambito
- authentication, security
Direzione di ricerca
Non vengono nominati file di implementazione, test o punti di ingresso. Inizia esaminando come keytrace legge attualmente i documenti DID e memorizza i record delle prove di identità, quindi determina l’ambito necessario per leggere e verificare bidirezionalmente anche le voci alsoKnownAs, mantenendo i metadati specifici di keytrace; done dovrebbe coprire l’approccio a strati concordato, con test per i tipi di URI supportati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
If Keytrace's goal is being "keybase on atproto", then it should use and incorporate the existing alsoKnownAs field of DID documents.
In addition to storing identity proofs as records in a user's repository, keytrace could use the alsoKnownAs field that's already part of every DID document. The W3C DID Core spec (§5.1.1) defines alsoKnownAs as an ordered set of URIs by which the DID subject can also be identified. Notably, these can be any valid URI, not just at:// handles, but also HTTPS URLs, other DIDs, dns: identifiers, etc.
Example
For example, my DID document has several entries. I have my primary handle "ngerakines.me" as well as the handles "nick.gerakines.net" and "nick.thegem.city". All three can be used to reference me in posts on the Bluesky AppView and all three formally resolve with _atproto DNS records. Then I reference my GitHub account, website, and domain.
The DID document for did:plc:cbkjy5n7bk3ax2wplmtjofq2 contains:
{
"@context": [ ... ],
"alsoKnownAs": [
"at://ngerakines.me",
"at://nick.gerakines.net",
"at://nick.thegem.city",
"https://github.com/ngerakines",
"https://ngerakines.me/",
"dns:ngerakines.me"
],
"id": "did:plc:cbkjy5n7bk3ax2wplmtjofq2",
"service": [ ... ],
"verificationMethod": [ ... ]
}
Per the DID Core spec, each value in alsoKnownAs is a URI (RFC 3986) that identifies the same subject as the DID. Breaking down each entry:
-
at://ngerakines.me—atscheme. Asserts this DID is the ATProto identity behind the handlengerakines.me. Verified through ATProtocol handle resolution with the resolved DID string matching the document's "id" field. The Bluesky AppView uses the first as the "primary" handle for display purposes. -
at://nick.gerakines.net—atscheme. Same DID, additional ATProto handle. Same handle resolution check fornick.gerakines.net. -
at://nick.thegem.city—atscheme. Same DID, additional ATProto handle. Same handle resolution check fornick.thegem.city. -
https://github.com/ngerakines—httpsscheme. Asserts this DID subject controls the GitHub accountngerakines. Verified via GitHub's social identities API, which exposes linked Bluesky handles that can be resolved back to the DID.$ curl -L \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/users/ngerakines/social_accounts [ { "provider": "bluesky", "url": "https://bsky.app/profile/ngerakines.me" } ] -
https://ngerakines.me/—httpsscheme. Asserts this DID subject controls the website atngerakines.me. Verified by checking for a<link rel="did" href="did:plc:cbkjy5n7bk3ax2wplmtjofq2">element in the page HTML. therel="did"value is technically invalid and should probably berel="alternative me"and reference an AT-URI of just the authority like"did:plc:cbkjy5n7bk3ax2wplmtjofq2".$ curl --silent https://ngerakines.me/ | htmlq 'link' ... <link href="did:plc:cbkjy5n7bk3ax2wplmtjofq2" rel="did"> -
dns:ngerakines.me—dnsscheme. Asserts this DID subject controls the DNS zone forngerakines.me. Verified by checking for a TXT record on the domain that references the DID.
Prior art: WeatherVane
The WeatherVane project (verify.aviary.domains) was an early experiment exploring this approach. It performs bi-directional verification of identities listed in alsoKnownAs, checking that the DID document points to an external identity and that the external identity points back to the DID. You can see it in action for the example above at verify.aviary.domains/did/did:plc:cbkjy5n7bk3ax2wplmtjofq2.
Lessons Learned
My personal opinion is that implementing everything at the DID document layer makes it prohibitive for most users. I generally don't recommend that people manually configure their DID document because it's risk, even with good tooling. Having an on-protocol record-based system like what you're doing with keytrace.dev makes a lot of sense and lowers the bar, making it a much more effective approach to creating cross-identity verification and links.
That said, I don't think the "alsoKnownAs" field should be discounted, especially for services and high-profile accounts. For service accounts that don't have repositories, like did:web:api.bsky.app, having an alsoKnownAs entry to the primary domain can convey ownership and direct association. It also reduces the number of hops necessary for tooling to perform verification.
- Identity links are available immediately during DID resolution, without needing to fetch repo data or hit an AppView
- It's protocol-native —
alsoKnownAsis part of the DID Core spec and already supported bydid:plcanddid:web - It's decentralized by design — no labeler or third-party service needed to verify claims, anyone can resolve and check
- It composes well — the same mechanism works across the broader DID ecosystem, not just ATProtocol
The "Extending Also Known As" blog post explores how the ATMosphere could adopt multiple alsoKnownAs entries beyond just the primary handle, which would further expand keytrace's ability to surface verified identities.
What this could look like for keytrace
Keytrace could adopt a layered approach:
- Read
alsoKnownAsfrom the DID document as a primary source of linked identities - Perform bi-directional verification for each URI (similar to WeatherVane's approach)
- Use keytrace-specific lexicon records for richer metadata, attestations, or identity types that don't fit neatly into a URI (this is where keytrace's own schemas add value beyond what
alsoKnownAsalone provides)
This gives users verified identity links "for free" at the DID layer, while keytrace's own records can layer on additional context, presentation, and proof types.
References
- W3C DID Core —
alsoKnownAs - WeatherVane — bi-directional identity verification tool
- Example verification: did:plc:cbkjy5n7bk3ax2wplmtjofq2
- Extending Also Known As — blog post on expanding
alsoKnownAsusage - RFC: Lexicon Resolution (Discussion #3074) — related discussion on identity and authority in ATProtocol
- Lingua principale
- TypeScript
- Stelle
- 86
- Fork
- 7
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di orta/keytrace
-
Add Bluesky profile linkAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 65/100
Tutte le issue di orta/keytrace
Issue simili
-
bug require-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
expressjs/expressjs.com#2549 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
umami-software/umami#4686 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
[Bug]: Device screenshot fails with 500 on iPhone Duo (Xcode 27.2): serve-sim calls simctl without --displayForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
pingdotgg/t3code#24900 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
inu-appcenter/UNIDorm-web#411 ·
I maintainer di solito rispondono entro 1 giorno
-
🐛 bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 2 giorni