Device Flow

GitHub的OAuth Device Flow(设备流,遵循 RFC 8628 标准)是一种专门为输入受限无浏览器环境设计的授权方式(有时候一些简单个人项目可能也懒得开发独立的登录页面)。简单来说,如果你开发的是一个运行在服务器黑窗口(CLI)或智能电视上的程序,用户没法直接在那个屏幕上输入 GitHub 账号密码或点击“授权”按钮,这时就需要用到Device Flow。

1. 核心功能与适用场景

传统的 OAuth 通常需要浏览器重定向,而 Device Flow 解决了以下场景的授权问题:

  • CLI 工具:gh (GitHub CLI)、Git 凭据管理器。
  • 无头服务器 (Headless): 只有 SSH 连接,没有图形界面。
  • 物联网设备: 如智能电视、智能音箱等。

2. 工作流程(六步走)

worker为使用cloudflare搭建的proxy,适用于没有后端服务器的纯前端场景。

  1. 第一步(请求代码):你的应用向 GitHub 发送一个请求(包含 client_id),表示“我想让用户授权我”,本地客户端 $\rightarrow$ 发送 client_id $\rightarrow$ Worker $\rightarrow$ GitHub
  2. 第二步(获取响应): GitHub $\rightarrow$ 返回响应 $\rightarrow$ Worker $\rightarrow$ 本地。应用在终端或屏幕上打印出网址和验证码,提示用户:“请在手机或电脑浏览器打开该网址并输入此代码”。GitHub 返回三个关键数据:
    • device_code:应用自己留着,用来“换token”。
    • user_code:给用户看的(通常是 8 位字符,如 ABCD-1234)。
    • verification_uri:告诉用户去哪里输入代码(通常是 https://github.com/login/device)。
  3. 第三步(用户授权):
    • 你拿着 user_code浏览器(直接访问 GitHub 官网)输入并确认授权。注意:这一步不经过 Worker,你的密码只给GitHub看。
  4. 第四步(轮询令牌): 应用每隔几秒钟询问一次 GitHub:“用户输完代码了吗?”
    • 本地客户端 $\rightarrow$ 带着 device_code 询问 $\rightarrow$ Worker $\rightarrow$ GitHub
    • GitHub 确认你已经在网页授权成功 $\rightarrow$ 返回 access_token $\rightarrow$ Worker $\rightarrow$ 本地

      这种架构在技术上是中转站,存在理论上的“中间人”风险,但由于 OAuth 2.0 的机制设计,我们的GitHub 账号密码是绝对安全的

3. AccessToken安全问题

  • 账号密码:绝对安全。 因为 Worker 永远接触不到你的 GitHub 登录界面。
  • Access Token(访问令牌):存在风险。 GitHub 发给你的 Access Token 会经过 Cloudflare 的内存。
    • 如果 Worker 的开发者(也就是你自己)在代码里加一句 console.log(data),那么你的令牌就会出现在 Cloudflare 的日志里。
    • 如果别人知道了你的 Worker URL,理论上他们可以尝试截获流量(虽然 HTTPS 保证了传输加密,但 Cloudflare 作为网关拥有解密权)。

评论