跳到正文
文档 · 电视和命令行工具

电视、游戏机和命令行工具

电视不方便显示登录页面,命令行工具也不应该索要密码。使用设备流程时,设备会显示一个简短的代码,用户在手机或电脑上打开环境的 Lobby,输入这个代码即可,而他们在这些设备上早已登录。

注册 App

在 Usher Console 中打开环境,然后前往 应用 → 新建应用 → 电视或命令行。它会获得一个客户端 ID,但没有机密:设备无法妥善保管机密。

流程

终端
# 1. the device asks for a code
curl -s -X POST https://acme.usherid.com/api/auth/device/code \
  -d client_id=YOUR_CLIENT_ID -d scope='openid email offline_access'
# → { "device_code": "…", "user_code": "6L95PBQQ",
#     "verification_uri": "https://acme.usherid.com/device",
#     "verification_uri_complete": "https://acme.usherid.com/device?user_code=6L95PBQQ",
#     "expires_in": 600, "interval": 5 }

# 2. it shows the code (and a QR code of verification_uri_complete), then polls
curl -s -X POST https://acme.usherid.com/api/auth/oauth2/token \
  -d grant_type=urn:ietf:params:oauth:grant-type:device_code \
  -d device_code=… -d client_id=YOUR_CLIENT_ID
# → { "error": "authorization_pending" } until the person allows it,
#   then { "access_token": "…", "id_token": "…", "refresh_token": "…" }
  • 礼貌地轮询:两次轮询之间等待 interval 秒。轮询得更快,会收到 slow_down 响应。
  • 收到指示就停止:access_denied 表示用户拒绝了;expired_token 表示已经过了十分钟。请重新申请一个代码。
  • 同时显示地址:不是每个人都能扫描二维码,请显示 verification_uri 和代码,代码按 6L95-PBQQ 的样式分隔。

在 /device 页面,Lobby 会向用户显示是哪个 App 在请求、请求的是什么。它会提醒用户:只有当这个流程是他们自己发起的,并且设备上显示的代码相同时,才继续操作。

将令牌绑定到设备(DPoP)

从设备上复制走的令牌,依然是一个有效的令牌。使用 DPoP(RFC 9449)时,设备保管一个私钥,并在每个请求中附上一份新签名的证明。绑定到这个密钥的令牌,离开了它就毫无用处。

  • 请求绑定令牌:在令牌请求中附上 DPoP 标头,Usher 就会把签发的令牌绑定到你的密钥(token_type 为 DPoP)。
  • 强制要求绑定:创建 App 时开启 要求 DPoP。此后,没有证明的请求,Usher 一概不会为它签发令牌。
  • 使用绑定令牌:使用 Authorization: DPoP <token>,并为该请求附上一份证明。
  • 库:大多数支持 DPoP 的 OAuth 库都会替你完成这一切(例如 openid-client 的 DPoP 选项)。