如何实现跨设备 OAuth 授权码中继
想在一台陌生设备上登录 AI 账号、又不让它留下任何登录信息——scheme 回传、后端回传、loopback 三类回程通道各自的接管办法。
跨设备 OAuth 授权码中继(cross-device OAuth authorization code relay / cross-device flow):
当你想在一台陌生的设备上登录你的AI账号(或者其他的鉴权账号),但是你不希望这台设备有登录信息(也就是不输入账号密码,不留下任何登录信息)。一方面可能是防止Google账号风控原因,又或者想做完全的隔离,只传输登录之后的鉴权
APP实现网页登录的四种形式
核心难题:认证必须在浏览器做,但结果要回到 APP,浏览器和 APP 是两个独立进程,怎么把凭证从浏览器交回 App?我将按「URL 带不带标识」和「回程通道」分三类
模式 A — loopback
APP 登录时在本机起一个临时 HTTP 服务器监听某端口(如 http://localhost:7536/callback)。打开的授权 URL 里 redirect_uri 指向这个本地端口。浏览器授权完,把 code 直接打到 localhost:端口,APP 收下参数获得token
注意
端口可固定可随机(Claude Code 默认随机、支持 --callback-port 钉死;Codex 随机)
代表:Codex、Claude Code、gcloud 等 CLI
模式 2A- 会话去程 + scheme 回传
APP 生成会话标识 session,拼在打开的登录 URL 上(.../login?session=XXX)。登录完成后,浏览器用 scheme 唤醒 app 并把参数带回。去程靠 URL 认这次登录,回程靠 scheme 传参。
模式 2B — 会话去程 + 后端回传
APP 生成 session 拼在 URL 上(扫码登录的二维码里编码的也是这个 session)。
关键区别:回程不经浏览器、不用 scheme。 APP 靠自己和后端早已建立的连接,拿着 session 向后端轮询/长连/等推送,登录成功后后端直接把凭证从这条连接推回 APP
提示
浏览器全程只负责「把 session 标记为已登录」,和 APP 之间从不直接通信
扫码登录是典型,手机和电脑网页之间从没传过 token,全靠后端认 session对上
模式 3 — 固定链接 + scheme 回传
APP 打开一个固定的登录链接,不拼任何自己的特殊参数。登录完成后,浏览器通过 scheme 唤醒 APP 并把参数一起传回
提示
去程 URL 干净、不带 session;绑定信息(anon_id)是在登录过程中产生、随 scheme 回传的
核心方案
对于「scheme 回传」方案,可以首先捕获一下登录链接,在自己的设备上登录完成之后,把登录后的回传 scheme 拷贝到目标机器上面运行即可实现登录
对于「后端回传」只需要劫持一下登录链接,在自己的设备(可信设备)上直接登录就行了
如果是使用loopback方案的话,除了劫持登录链接之外,还需要设定一个反向隧道,也就是可信设备上的localhost被反向到陌生设备上,这样就可以将参数传递过去
提示
也就是理论上完全可以实现代理登录,可以在可信设备上进行登录操作,陌生设备只保留APP的鉴权信息,不包含登录过程
警告
下方提供一种方式实现Claude桌面版的中继登录,请勿滥用会导致方式变化
其他方案
如果APP是使用凭证文件来鉴权的话,可以使用直接拷凭证文件的方式
也就是说把登录一次后的 auth凭证文件(如 Codex 的 ~/.codex/auth.json)拷给另一台设备
提示
展望未来:我想的原本是类似于挂载一样,把我已登录的浏览器挂载在公司电脑上,就类似于docker的磁盘挂载。公司电脑点击授权其实是我的浏览器容器打开相关网页,登录完成之后我的浏览器容器打开相应界面(scheme或者http://localhost:port)也能正常和公司电脑传递信息
补充-什么是 URL scheme
你熟悉的 https://claude.ai 里,https 就是一个 scheme——它告诉操作系统/浏览器「这个链接该交给谁处理」。https 交给浏览器,mailto: 交给邮件客户端,tel: 交给电话应用。
自定义 scheme(也叫 deep link / 深链)就是应用自己注册一个私有的前缀,比如 claude://、spotify://、zoommtg://。注册之后,系统里任何地方触发这个前缀的链接,操作系统就会把它连同后面的内容一起,当作启动参数交给那个应用。
应用怎么注册一个 scheme
每个操作系统有自己的注册表位置:
- Windows:注册表
HKEY_CLASSES_ROOT\<scheme>\shell\open\command,值指向App.exe "%1"(%1就是完整 URL) - macOS:app 的
Info.plist里声明CFBundleURLSchemes,由 LaunchServices 管理 - Linux:
.desktop文件里写MimeType=x-scheme-handler/<scheme>,由 xdg-mime 管理
注册有两种时机:
1、安装时静态注册:装应用时就写进注册表
2、运行时动态注册:应用启动时用代码注册(Electron 的 app.setAsDefaultProtocolClient('claude'))
一个scheme被点开时发生了什么
假设有人触发了 claude://login/google-auth?code=XXX&anon_id=YYY:
1、触发方可以是浏览器里 window.location = "claude://..."、可以是 cmd 里 start "" "claude://..."、可以是 Win+R 粘贴。
2、系统看到 claude:// 这个前缀,去注册表找谁认领了 claude
3、拉起应用 + 传参:找到 Claude,就用整条 URL 作为命令行参数启动它(如果 Claude 已经在运行,则通过进程间通信把 URL 送给已有实例,而不是开新的)
4、应用内部解析:Claude 收到 claude://login/google-auth?code=XXX&anon_id=YYY,自己解析出 code 和 anon_id,执行对应逻辑
Claude 桌面版跨设备 OAuth Scheme 中继登录
目标:在公司电脑登录 Claude 桌面版,但让 Google 认证只发生在家里已登录 Google 的 Chrome,使 Google 侧设备/IP/指纹不变、不触发风控。公司电脑只拿到 Claude 登录态,不接触 Google 凭证。
形态:像磁盘挂载一样——登录时家里 Chrome 临时充当公司 app 的登录浏览器,可随时挂/卸,两边互不影响。
记录日期:2026-08-31(基于当时的 Claude Desktop 行为,机制可能随版本变化)
一、已实测确认的机制
-
Claude 桌面版登录用自定义 scheme 回传:浏览器完成 Google 登录后,唤起
claude://login/google-auth?code=<Google授权码>&anon_id=<claudeai.v1.UUID>app 接住code+anon_id后,自己去后端换 Claude 登录态 -
scheme 名是
claude,属运行时动态注册(静态注册表HKCR\claude、HKCU\Software\Classes\claude下只有空壳,没有shell\open\command) -
发起授权页是
https://claude.ai/login/app-google-auth?open_in_browser=1 -
家里独立登录生成的
claude://能成功登入公司电脑的 app
二、手动流程(已跑通)
1、家里 Chrome 进入https://claude.ai/login/app-google-auth?open_in_browser=1完成 Google 登录,走到「Open Claude」页

2、打开DevTools(F12)的网络面板,监听请求
3、点击取消之后再次点击 Open Claude
4、找到那条红色的 google-auth?code=... / claude://login/google-auth... 请求,复制链接地址

5、公司电脑打开登录界面

6、公司电脑执行(确保 Claude app 已启动、停在登录界面):
CMD上执行
start "" "claude://login/google-auth?code=...&anon_id=..."或者在powershell上
Start-Process "claude://..."或者在WIN + R 上:
"claude://..."Codex / CLI 的 loopback + PKCE 端口回调方式
另一类工具(Codex、Claude Code、gcloud 等 CLI)不用 scheme,走的是 loopback 回调。原理和接管方式都和 Claude 桌面版不同,放在这里对照
跨设备做法:SSH 端口转发
把「发起工具那台」的 localhost:P 通过 SSH 隧道经 VPS 接到「有登录态浏览器那台」,让回调穿隧道回流。
# 发起工具那台(比如公司):把本地监听端口暴露到 VPS 的 Q
autossh -M 0 -N -R 127.0.0.1:Q:localhost:P vps
# 有浏览器那台(比如家里):把本机 localhost:P 接到 VPS:Q
autossh -M 0 -N -L 127.0.0.1:P:127.0.0.1:Q vps与 scheme 方式的区别(核心)
| scheme 回传(Claude 桌面版) | loopback 回传(Codex/CLI) | |
|---|---|---|
| code 怎么回到工具 | 浏览器唤起 claude://... 塞回本机 app | 浏览器打到 localhost:P |
| 接管点 | 接管 scheme handler | 接管本地端口(端口转发) |
| 跨设备搬什么 | 搬 claude:// 完整 URL | 用隧道把端口接过去 |
| 出口是否要处理 | 要(搬 claude:// 回执行端) | 要(隧道把回调接回发起端) |
提示
当然我也想请你看看如果对于loopback 回传,将最终的localhost:P/?这一串参数直接拿过去,就类似于scheme 回传,能不能成功。按理来说这种应该也是可以的!
评论
评论加载中……