We recently built cross-app authentication between Roomy and OpenMeet using AT Protocol service auth JWTs. The idea came from @erlend.sh (his writeup), @zicklag.dev introduced me to PDS service auth, and @meri.garden contributed reviews. I made the implementation in both apps: A user logs into Roomy, navigates to an OpenMeet event, and is silently authenticated and able to use their account on OpenMeet without a second login.
Full technical writeup: Cross-App Authentication on AT Protocol
I’m not a protocol designer or auth expert, and I want to make sure I’m not building on wrong assumptions.
-
Is third-party consumption of PDS-signed tokens an intended pattern? The service auth discussion says PDS instances should not accept service auth from other services. I read that as PDS-to-PDS specifically. OpenMeet is a third-party app server consuming a PDS-signed JWT to verify identity. Bluesky’s chat service seems to do something similar (
aud=did:web:api.bsky.chat#bsky_chat). I modeled my approach on that, just outside Bluesky’s service mesh. Am I reading this right? -
Should cross-app auth use a shared
lxmor per-app identifiers? I usenet.openmeet.authas thelxmclaim — a convention string in NSID format with no published lexicon. Bluesky uses published methods likechat.bsky.convo.getConvo. If other apps adopt this pattern, they’d each pick their ownlxm. Would a shared community lexicon (e.g.,community.lexicon.auth.exchangeServiceToken) make more sense, withauddifferentiating the target service? Or is per-app NSID the right approach? -
audformat for non-PDS services. The permissions spec definesaudas “DID followed by required service type fragment” (e.g.,did:web:api.example.com#svc_chat). I usedid:web:api.openmeet.netwith no fragment, and it works. But the spec suggests I should have one. Is a bare DID sufficient, or should I publish a service entry with a fragment like#openmeet_auth? -
Relationship to FedCM. There’s active work on FedCM support and an open PR for
id_token_hint. My understanding is FedCM would let the browser mediate identity handoff natively, eliminating magic login links. It would also solve the ToS problem below, since FedCM’s client metadata includesterms_of_service_urlshown before first sign-up. How should implementers building cross-app auth today plan for this transition? -
When should ToS consent happen? OpenMeet auto-creates an account when a new DID arrives via service auth, before the user hay have seen OpenMeet or agreed to its Terms of Service. FedCM handles this for browser flows (see Q4), but for API-only access where the user never visits OpenMeet directly, it’s unclear. Is there an emerging pattern for ToS consent when identity flows silently between apps?
Really curious to hear what folks think, and how others have approached it. Thanks for your time.