-
Notifications
You must be signed in to change notification settings - Fork 161
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
identity: add Resolver
interface; and SkipHandleVerification
flag on BaseDirectory
#872
Conversation
I don't mind the idea of two caches here, I think your assumption that a caller will likely be using mostly one type of method (Resolve vs Lookup) is reasonable. The naming is a bit ambiguous imo but I think it makes sense to maintain compatibility with the existing APIs and it's fine. I do think the "Resolve" method should get something that contains the entire DID doc as it's a "low level" API here compared to the "Lookup" API. |
7c9310d
to
959bddd
Compare
959bddd
to
c838c49
Compare
Resolver
interface; and SkipHandleVerification
flag on BaseDirectory
The motivation for this has bumped up in a couple places:
It felt like this PR wasn't hitting all the use-cases the way I wanted, so I refactored a bit. The changes are:
Possible additional changes:
|
atproto/identity/did.go
Outdated
@@ -13,26 +14,62 @@ import ( | |||
"github.com/bluesky-social/indigo/atproto/syntax" | |||
) | |||
|
|||
// WARNING: this does *not* bi-directionally verify account metadata; it only implements direct DID-to-DID-document lookup for the supported DID methods, and parses the resulting DID Doc into an Identity struct | |||
// Variant of ResolveDID which parses in to a DIDDocument struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is ResolveDID
not a 'variant'? the think-o was that this is the variant of resolveDIDBytes() that does unmarshal? Probably:
// ResolveDID fetches a DIDDocument
// No further resolution (e.g. handle resolution) within the DIDDocument is performed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
good catch! mangled copy/paste
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
one comment oddity, otherwise LGTM; I like the no-handle mode (-:
Caching identity service. - [x] rebase on #872 - [x] review the above, ensure it still makes sense for this application - [x] actually use redis caching directory - [x] client package (which implements `identity.Directory` interface) - [x] config, rate-limit, or admin auth for refreshIdentity (?) - [x] basic firehose consumer (for `#identity` events) NOTE: this was previously called `domesday`, it has been updated to `bluepages` to be a bit more legible.
NOTE: see comments below; the PR has been updated to be about a new
identity.Resolver
interface, instead of expandingidentity.Directory
This is a step in the right direction for this package, I think:
Lookup*
for full bi-di verification, and gives a compact/ergonomic struct for atproto use-cases (and good for caching)Resolve*
does more bare-bones resolution: you get specifically what you ask for. Things like Relay, or pure service auth validation, which don't care about handles, can useResolveDID
Downsides and open questions:
ResolveDID
doesn't return the raw DID doc verbatim, it is a struct, and might be discarding info (like fields in DID core specification that we aren't using). I think this is good enough, maybeBaseDirectory
can expose more "Raw" variants which returnjson.RawMessage
ormap[string]any
or something.ResolveDID
isn't the sameIdentity
type used in possible function signatures. They can be converted, but it uses some allocs etc. I think adding a helper to quickly extract the DID signing key and/or PDS endpoint is probably sufficient? But feels a bit redundant withIdentity
structIdentity
struct (compact) or theDIDDocument
struct, and convert between? Or both, would be less conversions but more RAM? I think what we should do is cache what is actually requested.Lookup*
cachesIdentity
,ResolveDID
caches DIDDocument, and these caches aren't shared. Services will be using one or the other anyways. What about an identity caching layer? That could cache the raw DID document and handle resolution, and convert toIdentity
on demand.Alternative would be breaking changes to existing structs (which are heavily cached), or maybe a flag or variant like
LookupDIDWithoutHandle
?Another alternative is to set a flag to skip handle resolution; I don't like this: #854
An upcoming change here is to add
ResolveNSID
, which will be used for Lexicon resolution.(have not pushed implementation of exiting interfaces until design questions are resolved)