This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

🚀 OAuth Migration to @atproto/oauth-client-browser#

Your app has been successfully set up with a new, simplified OAuth implementation using the official @atproto/oauth-client-browser package. This migration will replace ~1000 lines of custom OAuth code with a robust, officially-maintained solution.

📁 New Files Created#

Core OAuth Implementation#

  • app/src/lib/oauth-client.ts - OAuth client setup and configuration
  • app/src/lib/auth-context-new.tsx - New auth context using OAuth client
  • app/src/lib/api-client.ts - Simplified API calls using OAuth sessions

Updated Pages#

  • app/src/app/auth/login/page-new.tsx - Simplified login page
  • app/src/app/auth/callback/page-new.tsx - Simplified callback handling

Documentation & Scripts#

  • OAUTH_MIGRATION_GUIDE.md - Detailed migration guide
  • test-new-oauth.js - Script to test new implementation
  • restore-oauth.js - Script to restore original implementation

🧪 How to Test the New Implementation#

1. Test the New OAuth System#

# Run the test setup script
./test-new-oauth.js

# Start the development server
cd app && npm run dev

2. Test Authentication Flow#

  1. Visit http://localhost:3000
  2. Click Login to go to the new login page
  3. Test with different handles:
    • Bluesky: yourhandle.bsky.social
    • Third-party PDS: handle.geese.blue
    • Custom domain: yourhandle.yourdomain.com
  4. Verify the callback completes successfully
  5. Check that you're authenticated on the home page

3. Test Session Management#

  1. Sign in and verify it works
  2. Refresh the page - should stay signed in
  3. Close and reopen browser - should restore session
  4. Test sign out - should clear session properly

4. Restore Original (if needed)#

# Restore the original implementation
./restore-oauth.js

✨ Key Benefits of Migration#

Simplified Codebase#

  • Removes ~1000 lines of custom OAuth code
  • No more manual PKCE flow implementation
  • No more custom DPoP token generation
  • No more complex nonce handling
  • Eliminates custom API routes (/api/auth/token, /api/auth/nonce)

Better Reliability#

  • Official implementation tested across many applications
  • Automatic token refresh with proper retry logic
  • Better error handling and recovery
  • Proper session lifecycle management

Enhanced Security#

  • Uses secure IndexedDB storage instead of localStorage
  • Follows latest AT Protocol OAuth specifications
  • Automatic DPoP implementation
  • Better session invalidation handling

Improved Developer Experience#

  • Direct integration with @atproto/api Agent
  • Automatic handle resolution
  • Built-in support for third-party PDS servers
  • Event listeners for session changes
  • Better TypeScript support

🔄 Migration Process (When Ready)#

Phase 1: Backup & Prepare#

# Already done - scripts handle this automatically

Phase 2: Switch to New Implementation#

# Replace the auth context import in layout.tsx
# From: '@/lib/auth-context'
# To:   '@/lib/auth-context-new'

Phase 3: Update Pages#

# Replace login page
mv app/src/app/auth/login/page.tsx app/src/app/auth/login/page-old.tsx
mv app/src/app/auth/login/page-new.tsx app/src/app/auth/login/page.tsx

# Replace callback page
mv app/src/app/auth/callback/page.tsx app/src/app/auth/callback/page-old.tsx
mv app/src/app/auth/callback/page-new.tsx app/src/app/auth/callback/page.tsx

Phase 4: Update API Calls#

Replace complex API calls throughout your app:

// Before
import { getProfile } from '@/lib/bluesky-api'
const profile = await getProfile(accessToken, keyPair, dpopNonce, handle, pdsEndpoint)

// After  
import { getProfile } from '@/lib/api-client'
const profile = await getProfile(session)

Phase 5: Cleanup (After Testing)#

Remove old files when confident in the new implementation:

  • app/src/lib/bluesky-auth.ts
  • app/src/lib/auth-context.tsx (old version)
  • app/src/lib/storage-util.ts
  • app/src/app/api/auth/token/route.ts
  • app/src/app/api/auth/nonce/route.ts

🛠 Compatibility Notes#

Legacy Code Support#

The new auth context provides backward compatibility:

  • accessTokensession?.accessToken
  • refreshTokensession?.refreshToken
  • didsession?.sub
  • handlesession?.info?.handle
  • pdsEndpoint → extracted from session info

Third-Party PDS Support#

Full support maintained for:

  • ✅ Bluesky (bsky.social)
  • ✅ Custom domains (alice.example.com)
  • ✅ Third-party PDS (geese.blue, etc.)
  • ✅ Self-hosted instances

Existing API Calls#

Most existing API calls will continue to work during transition period due to legacy compatibility properties.

🐛 Troubleshooting#

If Login Fails#

  1. Check browser console for errors
  2. Verify client metadata is accessible at https://flushes.app/client-metadata.json
  3. Ensure handle resolution is working
  4. Test with a simple Bluesky handle first

If Session Not Restored#

  1. Check if IndexedDB is enabled in browser
  2. Verify no browser extensions blocking storage
  3. Check for console errors during initialization

If API Calls Fail#

  1. Verify session object has required properties
  2. Check if using new API client methods
  3. Ensure proper error handling for session expiration

📞 Support#

If you encounter any issues:

  1. Check the logs - The new implementation provides detailed console logging
  2. Test incrementally - Use the test scripts to verify each step
  3. Rollback if needed - The restore script quickly reverts changes
  4. Reference the guide - See OAUTH_MIGRATION_GUIDE.md for detailed steps

🎉 Next Steps#

  1. Test thoroughly with the new implementation
  2. Update your components to use the new auth context
  3. Migrate API calls to use the new client
  4. Remove old files once confident in the new system
  5. Enjoy the simplified, more reliable OAuth flow!

The migration significantly reduces complexity while providing better reliability, security, and developer experience. The official @atproto/oauth-client-browser package handles all the OAuth complexity for you.