Skip to main content

概觀

Bluesky 的 OAuth 基於 AT Protocol,與 GitHub、Google 等一般 Socialite 提供者有很大差異。
Bluesky 的 OAuth 在實作上與其他 Socialite 提供者根本不同。會使用 DPoP(Demonstrated Proof of Possession)與 PAR(Pushed Authorization Requests)端點。不需要 client_secret,改為使用私鑰。

與一般 OAuth 的差異

認證流程

安裝與設定

建立私鑰

首先產生私鑰。此步驟無需向 Bluesky 註冊即可完成。
將輸出的值複製到 .env
Bluesky 不需要註冊 client_idclient_secret。僅設定私鑰即可使用 OAuth 認證。

預設 OAuth scope

套件已使用支援三個主要使用情境的預設 OAuth scope 進行設定。
  1. Socialite 登入 — 透過 atprotoaccount:emailinclude:app.bsky.authViewAll 啟用使用者認證與 email 存取
  2. 貼文 — 透過 include:app.bsky.authCreatePostsblob:*/* 允許建立貼文與上傳圖像 / 影片
  3. DM 通知 — 透過 rpc:chat.bsky.convo.sendMessagerpc:chat.bsky.convo.getConvoForMembers 啟用通知用的私訊發送
可透過設定 BLUESKY_OAUTH_SCOPE 環境變數自訂 scope。
關於可用 scope 的詳細內容,請參考 AT Protocol Permission Requests 文件

本機開發

預設設定為 http://localhosthttp://127.0.0.1:8000/,本機開發不需要額外設定。

正式環境

若存在名為 bluesky.oauth.redirect 的路由,即無須設定 .env。若變更了預設路由名稱,才需設定。

路由設定

建議 callback 路由的名稱為 bluesky.oauth.redirect,套件在內部會使用此名稱。

本機開發中的 callback 處理

本機開發期間,Bluesky 的 callback URL 會固定為 http://127.0.0.1:8000/。可在路由層級進行分派。

Controller 實作

使用者資訊(OAuthSession)

以下是可從 $user->session 取得的 OAuthSession 主要方法。 如需確認所有屬性,可使用 toArray()

資料庫設定

users 資料表新增 Bluesky 專屬欄位。DID 為 Bluesky 使用者的唯一識別碼。

OAuthSession 的重複使用

可以使用儲存在 session 中的 OAuthSession 呼叫 API。
在 Job 或 Console 等無法使用 Laravel session 的情境,可從 DB 取得資料以組合 OAuthSession。

自動更新 token

Refresh token 只能使用一次,因此更新後必須重新儲存至 DB。可使用 OAuthSessionUpdated 事件。
於重新整理開始時也會發送 OAuthSessionRefreshing 事件。此時 refresh_token 已失效,先從 DB 中刪除較為安全。

WithBluesky Trait

於 User 模型加入 WithBluesky trait 並實作 tokenForBluesky(),即可透過 $user->bluesky() 取得已認證的 client。

client-metadata 的自訂

套件會自動定義 bluesky.oauth.client-metadatabluesky.oauth.jwks 路由。通常不需修改,但可透過 OAuthConfig 進行自訂。

未認證時的行為

OAuthSession 為 null 或無 refresh token 時,會擲出 Unauthenticated 例外,並重新導向至 login 路由。
最後修改於 2026年8月2日