跳至內容
文件 · 電視與命令行工具

電視、遊戲機與命令行工具

電視不容易顯示登入頁面,命令行工具也不該要求輸入密碼。透過裝置授權流程,裝置會顯示一個簡短的代碼,用户則在已經登入的手機或電腦上,把代碼輸入環境的 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 表示已經過了十分鐘。請索取新的代碼。
  • 同時顯示網址:不是每個人都能掃描 QR 碼,因此請顯示 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 選項)。