Repository navigation
Add fyi.atstore.directory.getListingAuth - #59
Open
chris-pardy wants to merge 1 commit into
Open
chris-pardy wants to merge 1 commit into
chris-pardy wants to merge 1 commit into
Conversation
A public query for how a listing's app signs in: authMethod, its OAuth client metadata URL (client_id) when known, and the scope last probed from that metadata. client_metadata_url from store_listing_oauth_discovery (well-known, Playwright or manual triage) wins over the periodic probe's successful_client_metadata_url; the probed scope is only returned when it came from the same client. Lets a PDS or client find the permissions an app asks for (e.g. to make a scoped app password) without re-probing the app's site. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019AnbyLhXS4koGFdgrG9YST
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A new public XRPC query,
fyi.atstore.directory.getListingAuth?uri=<listing.detail AT URI>, that says how a listing's app signs users in:{ "uri": "at://…/fyi.atstore.listing.detail/…", "authMethod": "oauth", // oauth | app_password | unsupported_mobile | unknown "clientMetadataUrl": "https://…/oauth-client-metadata.json", // the app's client_id, or null "scope": "atproto include:…", // scope line last probed from that metadata, or null "checkedAt": "2026-10-28T…Z" // when it was probed, or null }Errors:
InvalidParams(400),ListingNotFound(404; same public-listing rules asgetListing).Why
AT Store already does the hard part of finding each app's OAuth client metadata: well-known probes, the Playwright pass, and manual triage in
store_listing_oauth_discovery. None of that reaches other atproto services today. I'm building scoped app passwords on a PDS: you pick an app from AT Store, and the password gets only the permissions the app asks for in OAuth. Without this endpoint the PDS has to re-probe each app's website. Against a handful of popular listings, that only found metadata for one in five, while AT Store already knows most of them.How
clientMetadataUrlis taken fromstore_listing_oauth_discovery.client_metadata_urlfirst, then fromstore_listing_oauth_probes.successful_client_metadata_url.authMethodis the discovery classification. With no discovery row, it isoauthif a probe found metadata, otherwiseunknown.scopeis the probe'sclient_scope_raw_line. It is only returned when the probe's URL matches the URL being returned, so a manually triaged client never gets another client's scope. It may be stale, and consumers should fetchclientMetadataUrlfor the authoritative scope.Changes: the lexicon (
lexicons/fyi/atstore/directory/getListingAuth.json, added tolex:genand regenerated), the NSID and method registry (soserver.describelists it), the handler, and a row on /developers/atproto.Testing
pnpm typecheck,oxlint,oxfmt --checkandpnpm test(128 passing).uri(400).🤖 Generated with Claude Code
https://claude.ai/code/session_019AnbyLhXS4koGFdgrG9YST