I guess in an alternative discussion angle: what is being gained with did:web or did:ap:web over essentially being a DID-style re-flavoring of WebFinger or just plain URLs? Is it explicitly prohibited to have a username-less query in WebFinger (such as to function as a “domain-based” handle)?
On other discussion points: what is the benefit of using a static .well-known address for the DID resolver, instead of the conventional “follow your nose” (pattern?) of ActivityPub, such as perhaps instead defining DID resolvers as a list in the endpoints property? I think even the DID core spec lets you use any URL structure for a DID resolver, rather than recommending a hard-coded path. For example, how favorable would the following suggestion below be (some properties skipped for brevity)?
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/data-integrity/v1"
],
"id": "https://example.social/did/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
"type": "Person",
"aliases": [
"https://fallback.example/resolve/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
"did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
"acct:alice@example.social",
"acct:alice@fallback.example"
],
"preferredUsername": "alice",
"endpoints": {
"sharedInbox": "https://example.social/sharedInbox",
"didResolvers": [
"https://example.social/did/",
"https://fallback.example/resolve/"
]
},
"inbox": "https://example.social/did/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2/inbox",
"outbox": "https://example.social/did/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2/outbox",
"followers": "https://example.social/did/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2/followers",
"following": "https://example.social/did/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2/following",
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-jcs-2022",
"created": "2023-03-28T07:22:00Z",
"verificationMethod": "did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
"proofPurpose": "assertionMethod",
"proofValue": "..."
}
}
aliases endorses the specific did:ap:key identifier.
didResolvers provides the client (and servers) the information for how/where to resolve the DID (and for the client to use for querying resources elsewhere, if authentication-gated), as any supported DID-based identifiers are appended to the recommended endpoints for resolution.
- Trim the recommended
didResolvers strings from the beginning of the actor ID, and beginning of other URLs listed in aliases, which should result in the plain DID, to imply to DID-aware ActivityPub servers that the resolver-based URL ID is just an alias for the DID.
- The identity proof covers the
did:ap:key listed in aliases, which matches with verificationMethod, so the identity is reciprocally self-endorsing.
To iterate further on the ID de-duplication:
Trimming https://example.social/did/ or https://fallback.example/resolve/ (whichever matches the beginning) from an ID, such as https://example.com/did/did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2 would result in an output of did:ap:key:z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2 which matches the DID listed in aliases, attesting they reference the same thing.
Meanwhile, further on the explicit /.well-known/apresolver path: it only incurs more limitations on implementers, while probably not gaining anything, while the actor’s server domain still has to be known anyway to make use of the /.well-known/apresolver path to begin with, and also limits implementers from choosing shorter options.
(Sorry if there’s anything I’m asking that I’ve already asked before, or discussion I’ve overlooked, as I tend to be a bit of an amnesiac sometimes)