如何实现跨设备 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,自己解析出 codeanon_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\claudeHKCU\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」页

Open Claude 页

2、打开DevTools(F12)的网络面板,监听请求

3、点击取消之后再次点击 Open Claude

4、找到那条红色的 google-auth?code=... / claude://login/google-auth... 请求,复制链接地址

DevTools 网络面板里那条 claude:// 请求

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

公司电脑上停在登录界面的 Claude 桌面版

6、公司电脑执行(确保 Claude app 已启动、停在登录界面):

CMD上执行

start "" "claude://login/google-auth?code=...&anon_id=..."

或者在powershell

powershell
Start-Process "claude://..."

或者在WIN + R 上:

"claude://..."

Codex / CLI 的 loopback + PKCE 端口回调方式

另一类工具(Codex、Claude Code、gcloud 等 CLI)不用 scheme,走的是 loopback 回调。原理和接管方式都和 Claude 桌面版不同,放在这里对照

跨设备做法:SSH 端口转发

把「发起工具那台」的 localhost:P 通过 SSH 隧道经 VPS 接到「有登录态浏览器那台」,让回调穿隧道回流。

bash
# 发起工具那台(比如公司):把本地监听端口暴露到 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 回传,能不能成功。按理来说这种应该也是可以的!

评论

评论加载中……

登录后再评论

注册要用邮箱收个验证码,只为确认邮箱能收信,不会拿去做别的。账号设置