電視、遊戲機與命令行工具
電視不容易顯示登入頁面,命令行工具也不該要求輸入密碼。透過裝置授權流程,裝置會顯示一個簡短的代碼,用户則在已經登入的手機或電腦上,把代碼輸入環境的 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選項)。