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.
Architecture fit: The release is a Symfony bundle, not a Laravel package — a material mismatch with the brief. It depends on Symfony's dependency-injection container, routing, console, and symfony/lock, and targets Symfony 7.2+/8.x. Laravel has no native path to boot a Symfony bundle (no service-provider auto-discovery, no config publishing, no Laravel HTTP client binding). The value on offer is the protocol logic — PAR, PKCE S256, DPoP with server nonces, ES256 private_key_jwt client assertions, DID/handle resolution — not the framework glue. For a Laravel codebase, treat this as a reference implementation to port, not a dependency to add.
Integration feasibility: The AT Protocol OAuth handshake is genuinely hard to get right (PAR, DPoP nonce negotiation and retries, bidirectional handle→DID checks, PDS/authorization-server discovery). A tested reference is worth more than the code itself. The fact it has run "in production on WecoPost" against bsky.social is meaningful signal, but n=1: one maintainer, one deployment, one PDS environment.
Technical risk:
did:web, non-bsky PDS hosts, and third-party authorization servers are unverified.atproto-oauth:generate-key implies local key storage; no stated KMS/HSM path, rotation plan, or recovery story. Key loss invalidates all sessions.Key questions:
did:web and non-bsky PDS implementations?Stack fit: Direct fit only for Symfony shops. For Laravel, the bundle itself is a non-starter; the reusable surface is the protocol logic (PAR, PKCE S256, DPoP nonce handling, ES256 client-assertion JWTs, DNS-TXT/well-known identity resolution, bidirectional handle verification, session refresh with locking).
Migration path: Two viable options.
Illuminate\Support\Facades\Http) with a DPoP nonce cache (Cache), and Cache::lock for serialized refresh. This keeps the auth flow in-process and avoids cross-service secrets.Do not attempt to wire the Symfony bundle into Laravel's container directly; the bundle's kernel-level wiring will fight the framework.
Compatibility: PHP 8.2+ aligns with current Laravel; Symfony components can be consumed as libraries if needed, but the bundle entrypoint should be treated as unshippable in a Laravel app. Watch symfony/lock backend choice — file locks are unsafe for multi-instance deployments.
Sequencing:
uploadBlob.Maintenance: v0.1.0 implies churn. If adopting the Symfony bundle, budget for tracking a fast-moving pre-1.0 upstream. If porting, the team owns the code and must track AT Protocol spec evolution (DPoP, PAR, identity resolution are still moving targets).
Support: Single-maintainer, single-deployment provenance. No stated SLA, support channel, or LTS commitment. Escalation path is effectively upstream issues.
Scaling: OAuth flows are per-session and low-volume; not a scaling concern. Real scaling risks sit in (a) distributed locking for session refresh — symfony/lock must be Redis/DB-backed in multi-instance deploys, not file-based; (b) XRPC concurrency and PDS-side rate limits; (c) DNS/HTTPS dependency during login — identity resolution couples your sign-in availability to external DNS and well-known endpoints, so cache resolutions and degrade gracefully.
Failure modes:
/.well-known/) → login unavailable even when the app is healthy.client_uri / client_id origin drift → authorization-server rejection on client metadata.Ramp-up: Steep. The team needs working fluency in AT Protocol OAuth, DPoP, ES256 client assertions, and DID resolution before owning either the integration or the port. Because it is Symfony-only, Laravel engineers cannot lean on framework familiarity — plan for a focused spike and a written internal runbook on the auth flow before committing to production use.
How can I help you explore Laravel packages today?