Vai al contenuto principale

Panoramica

Laravel Bluesky supporta due metodi di autenticazione. Dopo l’autenticazione, le chiamate API sono comuni a entrambi i metodi.
ElementoApp PasswordOAuth
Classi interneLegacyAgent / LegacySessionOAuthAgent / OAuthSession
Entry pointBluesky::login()Bluesky::withToken(OAuthSession)
Chiave privataNon necessariaServe BLUESKY_OAUTH_PRIVATE_KEY
Azione di autorizzazione dell’utenteNon necessariaNecessaria (approvazione nel browser)
Esecuzione in background✅ Ideale✅ Possibile (salvando refresh_token)
Chiavi di sessioneaccessJwt / refreshJwtaccess_token / refresh_token
DeprecatoNo
Usi principaliPost automatici, notifiche, batch processingOperazioni per conto dell’utente, integrazione Socialite
Il nome LegacyAgent significa “metodo di autenticazione precedente a OAuth”, ma App Password in sé non è deprecato. Per notifiche e post automatici, quando non c’è interazione utente, App Password è più semplice e adatto.

Architettura

BlueskyManager è l’implementazione dietro alla Facade Bluesky. Configuri l’agente con login() o withToken() e da quel momento le chiamate API usano gli stessi metodi indipendentemente dal metodo di autenticazione.

App Password (LegacyAgent)

Flusso di autenticazione

Bluesky::login()

Basta impostare l’App Password in .env e chiamare login().
BLUESKY_IDENTIFIER=your-handle.bsky.social
BLUESKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
use Revolution\Bluesky\Facades\Bluesky;

$response = Bluesky::login(
    identifier: config('bluesky.identifier'),
    password: config('bluesky.password'),
)->post('Hello Bluesky');

Riutilizzo di LegacySession

Chiamare login() ogni volta genera una richiesta API a ogni chiamata. Mettere in cache la sessione e riutilizzarla è più efficiente.
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Session\LegacySession;

// Primo login e salvataggio della sessione
Bluesky::login(
    identifier: config('bluesky.identifier'),
    password: config('bluesky.password'),
);
cache()->put('bluesky_session', Bluesky::agent()->session()->toArray(), now()->addDay());

// Nelle esecuzioni successive, ripristina dalla cache
$session = LegacySession::create(cache('bluesky_session', []));
Bluesky::withToken($session);

// Se l'access token è scaduto, aggiornalo
if (! Bluesky::check()) {
    Bluesky::refreshSession();
}

$response = Bluesky::post('Hello from cached session');

Chiavi principali di LegacySession

ChiaveContenutoMetodo
accessJwtAccess tokentoken()
refreshJwtRefresh tokenrefresh()
didDID Blueskydid()
handleHandlehandle()
emailIndirizzo emailemail()
activeSe l’account è attivoactive()

Casi d’uso adatti

  • Post automatici in background job e job in coda
  • Notifiche tramite un canale Laravel Notification
  • Batch processing e schedulazione
  • Quando si pubblica con l’account dell’applicazione stessa

OAuth (OAuthAgent)

Flusso di autenticazione

Bluesky::withToken()

Passa a withToken() la OAuthSession ottenuta tramite Socialite.
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Session\OAuthSession;

// Ripristino dalla sessione Laravel (richiesta web)
$session = OAuthSession::create(session('bluesky_session'));
$timeline = Bluesky::withToken($session)->getTimeline();
Anche in background job e da Console puoi ricostruire una OAuthSession a partire dai valori salvati in DB.
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Session\OAuthSession;

$session = OAuthSession::create([
    'did'           => $user->did,
    'refresh_token' => $user->refresh_token,
    // Per gli account non su bsky.social, specifica anche iss
    // 'iss'        => $user->iss,
]);

$response = Bluesky::withToken($session)
                   ->refreshSession()
                   ->post('Hello from OAuth');

Chiavi principali di OAuthSession

ChiaveContenutoMetodo
access_tokenAccess tokentoken()
refresh_tokenRefresh token (utilizzabile una sola volta)refresh()
did / subDID Blueskydid()
issURL del server di autorizzazioneissuer()
profile.handleHandlehandle()
profile.displayNameNome visualizzatodisplayName()
Il refresh_token OAuth può essere usato una sola volta. Usa l’evento OAuthSessionUpdated e assicurati di aggiornare il DB dopo ogni refresh del token. Per i dettagli consulta Socialite.

Casi d’uso adatti

  • Login utente con Socialite
  • Chiamate API per conto dell’utente
  • Quando è necessario operare con account diversi a seconda dell’utente

Le chiamate API dopo l’autenticazione sono comuni

Con entrambi i metodi di autenticazione, dopo withToken() si usano gli stessi metodi API.
use Revolution\Bluesky\Facades\Bluesky;
use Revolution\Bluesky\Session\LegacySession;
use Revolution\Bluesky\Session\OAuthSession;

// App Password
Bluesky::login(config('bluesky.identifier'), config('bluesky.password'));

// oppure OAuth
$session = OAuthSession::create(session('bluesky_session'));
Bluesky::withToken($session);

// ↓ Da qui in poi le chiamate API sono completamente comuni ↓

Bluesky::post('Hello Bluesky');
Bluesky::getTimeline();
Bluesky::getProfile();
Bluesky::searchPosts(q: '#laravel');
BlueskyManager internamente sceglie tra LegacyAgent o OAuthAgent, ma il codice chiamante non ne risente.

Quale scegliere

SituazioneConsigliato
Post automatici, notifiche, batchApp Password
Funzione di login utenteOAuth
Solo background jobApp Password
Serve operare per conto dell’utenteOAuth
Priorità alla semplicità operativaApp Password
Priorità a sicurezza e controllo dei permessiOAuth
Se sei indeciso, il criterio più semplice è dividere in base all’obiettivo. Se “è l’app che agisce da sola” → App Password; se “è l’utente che opera” → OAuth. È anche possibile combinare i due: ad esempio usare App Password per le notifiche e OAuth per il login utente è una configurazione molto comune.
Ultima modifica il 13 luglio 2026