Syndroo文档
网站GitHub概览

凭证

在本地工作流中,凭证只读取一次,按提供商的模式验证,然后由 Core 保存。之后发布时绝不会重新读取你导入的环境变量或文件。可选的自托管 Server 会在独立的私有状态中保存部署机密。

两个明确的来源

  • --from-env 只读取 SYNDROO_CREDENTIALS:一个 JSON 对象,最大 64 KiB。
  • --credential-file 读取一个结构相同的私有 JSON 文件。

同时传入两者,或提供商需要凭证却两者都不传,都会被拒绝。在终端交互运行时,还会提供字段逐项输入;提供商标记为机密的字段会关闭回显读取。非交互运行从不猜测,也从不阻塞。

各提供商的字段名

提供商凭证对象机密字段
Blueskyidentifier、password(均必填)password
Threadsclient_id、client_secret(均必填)client_secret
LinkedInclient_id、client_secret(均必填)client_secret
Mastodon{}:可接受的对象为空无:使用浏览器授权
DEV.toapiKey(必填)apiKey

凭证对象中的未知键会被拒绝,因为每个提供商的凭证模式都把 additionalProperties 设为 false。

# Bluesky
export SYNDROO_CREDENTIALS='{"identifier":"you.bsky.social","password":"APP_PASSWORD_PLACEHOLDER"}'

# DEV.to
export SYNDROO_CREDENTIALS='{"apiKey":"DEV_TO_API_KEY_PLACEHOLDER"}'

应用客户端属于连接选项,不属于凭证

LinkedIn、Threads 和 Mastodon 通过请求文档中的连接选项接收应用客户端,机器调用方可借此跳过交互提示:

提供商必需的连接选项可选的连接选项
Bluesky无无
DEV.to无无
LinkedInredirectUriclientId、clientSecret、scopes
ThreadsredirectUriclientId、clientSecret、apiHost、authorizationHost、scopes
Mastodoninstance、redirectUri、scopesclientId、clientSecret

服务器凭证

自托管 Server。Server 设置使用 @syndroo/[email protected] 和 @syndroo/[email protected]。Server 流程不使用上文所述的本地 SYNDROO_CREDENTIALS 导入。

server connect threads 通过隐藏的终端输入、THREADS_APP_SECRET 或 --app-secret-stdin 读取 App Secret。Cloudflare 认证来自现有的 Wrangler 登录。限定范围的 CI bearer 保存在私有位置,或在设置请求恢复时通过 --ci-token-stdin 提供。

绝不要把 App Secret、CI bearer、Cloudflare admin bearer、SECRET_KEY 或 RUNTIME_KEY 放入命令参数、日志、聊天消息或仓库文件。部署凭证可以通过受保护的输入,与 server deploy --yes --credentials-stdin 一起导入。参见部署服务器和Server 命令参考。

凭证保存之后

Core 将凭证保存在本地凭证存储中,并在连接上记录引用;插件只收到其自身操作所需的内容。发布不依赖环境变量或导入文件继续存在,因此连接成功后即可删除该文件。

连接断开时,保存的凭证会被释放。断开只会删除本地记录:Syndroo 绝不会撤销平台凭证,因此还应到平台撤销。每份平台指南都说明其撤销流程中已有文档记录的部分。

本地浏览器授权

LinkedIn、Threads 和 Mastodon 都通过浏览器完成的授权动作建立连接。本地 CLI 会自行完成这三者的 OAuth 回调。使用 --redirect-uri 时,它会在进程内准确绑定该回环主机、端口和路径,并且只接收一次重定向;默认值是预先可注册的回环 URI,绑定需要控制终端,没有控制终端时会报告待处理动作并以退出码 0 结束。使用 --callback-url - 时,它会改为从标准输入读取重定向 URL。包含 code 或 state 的回调 URL 会在命令行上以 CALLBACK_URL_INVALID 拒绝,因为机密不得进入参数向量。这条本地回调路径只通过针对本地 HTTP 服务器的模拟测试验证;尚未连接真实的 LinkedIn、Threads 或 Mastodon 账号。