概览
Bluesky 的 OAuth 基于 AT Protocol,与 GitHub、Google 等常规的 Socialite provider 有很大不同。与常规 OAuth 的区别
认证流程
安装与配置
创建私钥
首先生成私钥。这一步无需在 Bluesky 上做任何注册。.env 中。
Bluesky 无需注册
client_id 或 client_secret。仅仅配置好私钥即可使用 OAuth 认证。默认的 OAuth scope
包默认配置了 3 个主要场景所需的 OAuth scope。- Socialite 登录 —— 通过
atproto、account:email、include:app.bsky.authViewAll启用用户认证与邮箱访问 - 发帖 —— 通过
include:app.bsky.authCreatePosts和blob:*/*允许创建帖子并上传图片、视频 - DM 通知 —— 通过
rpc:chat.bsky.convo.sendMessage和rpc:chat.bsky.convo.getConvoForMembers启用用于通知的 DM 发送
BLUESKY_OAUTH_SCOPE 环境变量自定义 scope。
本地开发
默认已经配置了http://localhost 和 http://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。自动刷新 token
refresh token 只能使用一次,因此更新后一定要重新写回数据库。这可以通过OAuthSessionUpdated 事件实现。
OAuthSessionRefreshing 事件。此时 refresh_token 已失效,建议先从数据库中删除它,更加安全。
WithBluesky trait
给 User 模型加上WithBluesky trait 并实现 tokenForBluesky(),就可以通过 $user->bluesky() 获取已认证的客户端。
自定义 client-metadata
包会自动定义bluesky.oauth.client-metadata 和 bluesky.oauth.jwks 路由。通常不需要修改,但你可以通过 OAuthConfig 进行自定义。
未认证时的行为
如果OAuthSession 为 null 或没有 refresh token,会抛出 Unauthenticated 异常并重定向到 login 路由。
Source: docs/socialite.md