账户、设备与共享
好友
添加好友,与信任的人共享会话,并通过用户名查找用户。
好友(Friends)是构建在 Kaiwu 会话之上的社交层:
- 发现:通过用户名(
@username)查找用户 - 申请:发送好友申请并管理好友关系
- 分享:直接与好友共享会话
服务器通过 GET /v1/features 告知客户端是否支持好友功能及 GitHub OAuth。UI 则利用该端点决定是否显示好友模块,以及是否提供 GitHub 关联入口。
身份模型(无论来源,统一为一个用户名)
Kaiwu 采用唯一的标识符进行用户发现:account.username。
- 用户搜索(
GET /v1/user/search)会匹配username - 好友申请在内部使用账户 ID,但在 UI 交互上以
@username为核心 - 用户名在服务器端会统一规范化为小写
用户无需关心某个用户名是来自 GitHub 还是手动设置的——直接搜索 @username 即可。
关联 GitHub(OAuth)
用户关联 GitHub 时:
- 服务器完成 OAuth 流程并获取
GET https://api.github.com/user(权限范围为read:user)。 - 服务器将该 GitHub 账户与 Kaiwu 账户绑定(1 个 GitHub 账户对应 1 个 Kaiwu 账户)。
- 服务器不会覆盖已有的
account.username。 - 若
account.username为空,服务器会尝试将其设置为该 GitHub 的login(转为小写),前提是该用户名尚未被占用。
如果该 GitHub 登录用户名已被占用(或不符合服务器的用户名规范),GitHub 依然可以成功关联,但应用会在完成好友功能设置前,提示用户另选一个 @username。
解除 GitHub 关联:
- 必定会移除 GitHub 绑定关系。
- 保留自定义用户名。
- 仅当
account.username与 GitHub 登录名一致(被视为“衍生自 GitHub”)时,才会清空该项。
仅用户名模式(无需 GitHub)
部分自托管服务器不希望强制绑定 GitHub。启用此模式后,用户可以直接认领本地用户名。
- 端点:
POST /v1/account/username - 校验规则由服务器环境变量控制(见下文)。
必须绑定 GitHub 的服务器上的用户名选取
即使好友功能要求绑定 GitHub,应用有时仍可能要求用户选择一个用户名。
这种情况通常发生在用户的 GitHub 登录名无法作为服务器上的唯一用户名时(例如已被占用)。此时:
- GitHub 仍可成功关联。
- 用户必须另选一个
@username,才能被其他人搜索到。 - 应用会在好友页面以及设置 → 账户中提示用户操作。
服务器配置
功能开关
KAIWU_FEATURE_SOCIAL_FRIENDS__ENABLED(true/false,默认true):好友功能端点及 UI 的总开关。KAIWU_FEATURE_SOCIAL_FRIENDS__ALLOW_USERNAME(true/false,默认false):false:好友申请与搜索必须关联 GitHub。true:好友功能只需认领@username(GitHub 关联可选)。
用户名策略(启用基于用户名的好友模式时)
FRIENDS_USERNAME_MIN_LEN(默认3)FRIENDS_USERNAME_MAX_LEN(默认32)FRIENDS_USERNAME_REGEX(默认^[a-z0-9_-]+$)
GitHub OAuth
启用 GitHub 关联所需的配置:
GITHUB_CLIENT_IDGITHUB_CLIENT_SECRETGITHUB_REDIRECT_URL(规范名称)或GITHUB_REDIRECT_URI(旧版名称)
可选配置:
KAIWU_WEBAPP_URL(默认https://kaiwu.wujilabs.cn):客户端的基础 URL / scheme。服务器回调完成后,会将请求重定向至${KAIWU_WEBAPP_URL}/oauth/github。- 只有在使用
https://kaiwu.wujilabs.cn上的托管客户端时,该项才属“可选”。如果您自托管了 Web 应用(或使用本地开发的 Web UI),请设置KAIWU_WEBAPP_URL(或KAIWU_WEBAPP_OAUTH_RETURN_URL_BASE),以便 OAuth 能正确跳回您的客户端。
- 只有在使用
GITHUB_STORE_ACCESS_TOKEN(true/false,默认false):是否在服务器上持久化存储 GitHub 访问令牌(好友功能不需要此项)。如果您通过AUTH_GITHUB_ORG_MEMBERSHIP_SOURCE=oauth_user_token强制校验组织成员身份(通过用户 OAuth 令牌模式进行成员校验),则必须存储令牌以执行离职/成员退出检查。详见组织成员身份来源。OAUTH_PENDING_TTL_SECONDS(默认600,最小60,最大3600):“待完成 OAuth(pending OAuth finalize)”(例如等待用户选择用户名)允许被完成的最长保留时间。- 旧版别名:
GITHUB_OAUTH_PENDING_TTL_SECONDS(未设置OAUTH_PENDING_TTL_SECONDS时生效)。
- 旧版别名:
GitHub 配置(OAuth App)
- 在 GitHub 中,进入 Settings → Developer settings → OAuth Apps → New OAuth App。
- 将 Authorization callback URL 设置为您的服务器回调端点:
https://YOUR_SERVER/v1/oauth/github/callback- 您无需启用 GitHub 的“设备流(Device Flow / device authentication flow)”。Kaiwu 使用标准浏览器重定向 OAuth 流程,因此让“Enable Device Flow”保持未勾选即可。
- 将 Client ID 和 Client secret 复制到服务器环境变量中,分别对应
GITHUB_CLIENT_ID和GITHUB_CLIENT_SECRET。 - 将
GITHUB_REDIRECT_URL设置为您在上面注册的同一回调 URL。 5.(自托管)将KAIWU_WEBAPP_URL设置为接收 OAuth 完成后重定向的 URL / scheme。- 服务器会重定向至
${KAIWU_WEBAPP_URL}/oauth/github?...
- 服务器会重定向至
客户端行为(UI)
- 好友功能入口位于
/friends。该路径不会发生重定向,且独立于位于/inbox的全局收件箱——详见收件箱与审批。 - 若好友功能被禁用(
features.social.friends.enabled=false),UI 会隐藏“好友”标签页及相关界面。 - 若好友功能要求绑定 GitHub(
features.social.friends.requiresGitHub=true),但尚未配置 GitHub OAuth(features.oauth.providers.github.configured=false),UI 会禁用 GitHub 关联按钮,并显示明确的“未配置”提示。
API 接口概览
GET /v1/features:服务器公布的功能特性开关(好友功能 + GitHub OAuth)。GET /v1/user/search?query=...:按用户名搜索用户。POST /v1/friends/add:发送好友申请。POST /v1/friends/remove:删除好友。GET /v1/friends:获取好友及好友关系列表。POST /v1/account/username:认领或更新用户名(需要身份认证;仅在好友功能已启用且满足“启用了基于用户名的好友模式”或“已关联 GitHub”之一时可用)。- 请求体:
{ "username": "alice" } - 成功返回:
200 { "username": "alice" } - 错误响应:
400 { "error": "friends-disabled" }:好友功能已禁用400 { "error": "username-disabled" }:未启用基于用户名的好友模式,且用户未关联 GitHub 身份400 { "error": "invalid-username" }:用户名未通过校验规则409 { "error": "username-taken" }:用户名已被占用
- 请求体:
© 乾元执中(南京)科技有限公司 · WUJI-Labs