wecoprod/atproto-oauth-bundle
Laravel package that adds AT Protocol (Bluesky) OAuth sign-in to your app. It handles the OAuth flow, DIDs, and session management so users can log in with their Atmosphere account, with drop-in integration into Laravel's existing auth system.
private_key_jwt ES256), so the decision "do we support Bluesky as an identity provider?" becomes a days-not-months estimate rather than a research spike.client_uri-vs-client_id origin validation — are already implemented and were exercised against bsky.social in production on WecoPost. The realistic alternative is 3–6 weeks of engineering plus ongoing spec-churn maintenance.AtprotoClient gives authenticated XRPC get, post, and uploadBlob with automatic token refresh. That directly unblocks "publish to Bluesky" and image-attachment features, which are the usual first two asks once social distribution is on the roadmap.SessionManager refreshes before expiry and serializes with symfony/lock (important for multi-worker/queue deployments — concurrent refreshes are a classic production incident), and supports revocation. This supports decisions like "can we offer disconnect/revoke account?" without bespoke work.atproto-oauth:generate-key command, which means adopting it implies hosting a stable public HTTPS client_id/metadata URL and managing an ES256 private key. That's an ops/security line item to price before committing.symfony/lock cache store) rather than "install and go."Adopt / evaluate when:
symfony/lock, HTTP client, and routing are compatible — the container/config glue is the work).client_id URL.post, uploadBlob, session refresh/revoke) — not just public read-only timeline fetches, which don't require this flow.Look elsewhere / defer when:
v0.1.0 means APIs can move; treat it as a pinned dependency behind your own interface.client_id origin matching gets complicated).Executives: This is a small, first-release library that lets us add "Sign in with Bluesky" and publish-to-Bluesky without building AT Protocol's authentication machinery ourselves. It was already run against bsky.social in production on another product, so the risky cryptography (DPoP, PAR, signed client assertions) is proven rather than theoretical. The cost is low and the payoff is a credible decentralized-social story and a new distribution channel. The caveat is maturity: it's v0.1.0, single-reference, no support contract — I recommend a two-week timeboxed spike behind a feature flag, not a bet-the-roadmap commitment.
Engineering: You get the full confidential-client flow, handle/DID/PDS/auth-server resolution with bidirectional handle verification, DPoP nonces, pre-expiry refresh serialized via symfony/lock, revocation, and an XRPC client with automatic refresh. What you don't get: a Laravel service provider, key rotation tooling, or caching for identity resolution. Budget for (1) an adapter layer — we should define our own interface and keep the bundle as an implementation detail so a v0.2 breaking change is a one-file fix, (2) hosting and monitoring the client_id metadata + JWKS endpoints, (3) secure private-key storage and a rotation runbook, (4) caching for DID/handle/PDS lookups since discovery is network-bound. Pin the version exactly; no caret ranges on a 0.x dependency.
Bottom line: worth a scoped pilot now; gate GA on a key-management story, a Laravel adapter, and a stability read on the next one or two releases.
How can I help you explore Laravel packages today?