跳转到主要内容

概览

Bluesky 的 OAuth 基于 AT Protocol,与 GitHub、Google 等常规的 Socialite provider 有很大不同。
Bluesky 的 OAuth 在实现上与其他 Socialite provider 有本质区别。它使用 DPoP(Demonstrated Proof of Possession)和 PAR(Pushed Authorization Requests)端点。不需要 client_secret,而是使用私钥。

与常规 OAuth 的区别

认证流程

安装与配置

创建私钥

首先生成私钥。这一步无需在 Bluesky 上做任何注册。
将输出的值复制到 .env 中。
Bluesky 无需注册 client_idclient_secret。仅仅配置好私钥即可使用 OAuth 认证。

默认的 OAuth scope

包默认配置了 3 个主要场景所需的 OAuth scope。
  1. Socialite 登录 —— 通过 atprotoaccount:emailinclude:app.bsky.authViewAll 启用用户认证与邮箱访问
  2. 发帖 —— 通过 include:app.bsky.authCreatePostsblob:*/* 允许创建帖子并上传图片、视频
  3. DM 通知 —— 通过 rpc:chat.bsky.convo.sendMessagerpc:chat.bsky.convo.getConvoForMembers 启用用于通知的 DM 发送
可以通过 BLUESKY_OAUTH_SCOPE 环境变量自定义 scope。
关于可用 scope 的详细说明,请参考 AT Protocol Permission Requests 文档

本地开发

默认已经配置了 http://localhosthttp://127.0.0.1:8000/,本地开发无需额外配置。

生产环境

只要存在名为 bluesky.oauth.redirect 的路由,就不需要设置 .env。仅当你修改了默认路由名时才需要配置。

路由配置

回调路由的路由名建议使用 bluesky.oauth.redirect,包内部会用到这个名称。

本地开发中的回调处理

本地开发时,Bluesky 回调的 URL 被固定为 http://127.0.0.1:8000/。在路由层做转发比较方便。

控制器实现

用户信息(OAuthSession)

以下是可以从 $user->session 获取的 OAuthSession 主要方法。 要查看所有属性,可以使用 toArray()

数据库配置

users 表中添加 Bluesky 相关字段。DID 是 Bluesky 用户的唯一标识符。

复用 OAuthSession

可以使用保存在 session 中的 OAuthSession 来调用 API。
在 Job、Console 等无法使用 Laravel session 的场景中,可以从数据库读取数据后组装 OAuthSession。

自动刷新 token

refresh token 只能使用一次,因此更新后一定要重新写回数据库。这可以通过 OAuthSessionUpdated 事件实现。
在刷新开始时还会派发 OAuthSessionRefreshing 事件。此时 refresh_token 已失效,建议先从数据库中删除它,更加安全。

WithBluesky trait

给 User 模型加上 WithBluesky trait 并实现 tokenForBluesky(),就可以通过 $user->bluesky() 获取已认证的客户端。

自定义 client-metadata

包会自动定义 bluesky.oauth.client-metadatabluesky.oauth.jwks 路由。通常不需要修改,但你可以通过 OAuthConfig 进行自定义。

未认证时的行为

如果 OAuthSession 为 null 或没有 refresh token,会抛出 Unauthenticated 异常并重定向到 login 路由。
最后修改于 2026年7月18日