ทีวี เครื่องเล่นเกม และเครื่องมือบรรทัดคำสั่ง
ทีวีแสดงหน้าลงชื่อเข้าได้ไม่สะดวก และเครื่องมือบรรทัดคำสั่งก็ไม่ควรขอรหัสผ่าน ด้วยโฟลว์สำหรับอุปกรณ์ (device flow) อุปกรณ์จะแสดงรหัสสั้นๆ แล้วผู้ใช้พิมพ์รหัสนั้นลงใน Lobby ของสภาพแวดล้อมบนโทรศัพท์หรือคอมพิวเตอร์ ซึ่งผู้ใช้ลงชื่อเข้าไว้อยู่แล้ว
ลงทะเบียนแอป
ใน Usher Console ให้เปิดสภาพแวดล้อม แล้วไปที่ แอปพลิเคชัน → แอปพลิเคชันใหม่ → ทีวีหรือบรรทัดคำสั่ง แอปจะได้ Client 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 จะแสดงให้ผู้ใช้เห็นว่าแอปใดกำลังขอ และขออะไร และบอกให้ดำเนินการต่อก็ต่อเมื่อผู้ใช้เป็นผู้เริ่มเอง และอุปกรณ์แสดงรหัสเดียวกัน
ผูกโทเค็นไว้กับอุปกรณ์ (DPoP)
โทเค็นที่ถูกคัดลอกออกจากอุปกรณ์ก็ยังเป็นโทเค็นที่ใช้ได้ ด้วย DPoP (RFC 9449) อุปกรณ์จะเก็บคีย์ส่วนตัวไว้ และส่งหลักฐานที่ลงนามใหม่ไปกับทุกคำขอ โทเค็นที่ผูกกับคีย์นั้นจะไร้ประโยชน์หากไม่มีคีย์
- ขอโทเค็นที่ผูกไว้: ส่งเฮดเดอร์
DPoPไปกับคำขอโทเค็น แล้ว Usher จะผูกสิ่งที่ออกให้กับคีย์ของคุณ (token_typeจะเป็นDPoP) - บังคับใช้: เปิด บังคับใช้ DPoP เมื่อคุณสร้างแอป จากนั้น Usher จะไม่ออกโทเค็นให้แอปหากไม่มีหลักฐาน
- ใช้งาน ด้วย
Authorization: DPoP <token>พร้อมหลักฐานสำหรับคำขอนั้น - ไลบรารี: ไลบรารี OAuth ส่วนใหญ่ที่รองรับ DPoP ทำทั้งหมดนี้ให้คุณ (เช่น ตัวเลือก
DPoPของopenid-client)