概觀
Bluesky 的 OAuth 基於 AT Protocol,與 GitHub、Google 等一般 Socialite 提供者有很大差異。與一般 OAuth 的差異
認證流程
安裝與設定
建立私鑰
首先產生私鑰。此步驟無需向 Bluesky 註冊即可完成。.env。
Bluesky 不需要註冊
client_id 或 client_secret。僅設定私鑰即可使用 OAuth 認證。預設 OAuth scope
套件已使用支援三個主要使用情境的預設 OAuth scope 進行設定。- Socialite 登入 — 透過
atproto、account:email、include:app.bsky.authViewAll啟用使用者認證與 email 存取 - 貼文 — 透過
include:app.bsky.authCreatePosts與blob:*/*允許建立貼文與上傳圖像 / 影片 - DM 通知 — 透過
rpc:chat.bsky.convo.sendMessage與rpc:chat.bsky.convo.getConvoForMembers啟用通知用的私訊發送
BLUESKY_OAUTH_SCOPE 環境變數自訂 scope。
本機開發
預設設定為http://localhost 與 http://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。自動更新 token
Refresh token 只能使用一次,因此更新後必須重新儲存至 DB。可使用OAuthSessionUpdated 事件。
OAuthSessionRefreshing 事件。此時 refresh_token 已失效,先從 DB 中刪除較為安全。
WithBluesky Trait
於 User 模型加入WithBluesky trait 並實作 tokenForBluesky(),即可透過 $user->bluesky() 取得已認證的 client。
client-metadata 的自訂
套件會自動定義bluesky.oauth.client-metadata 與 bluesky.oauth.jwks 路由。通常不需修改,但可透過 OAuthConfig 進行自訂。
未認證時的行為
當OAuthSession 為 null 或無 refresh token 時,會擲出 Unauthenticated 例外,並重新導向至 login 路由。
Source:docs/socialite.md