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)