ข้ามไปยังเนื้อหา
เอกสาร · ทีวีและเครื่องมือบรรทัดคำสั่ง

ทีวี เครื่องเล่นเกม และเครื่องมือบรรทัดคำสั่ง

ทีวีแสดงหน้าลงชื่อเข้าได้ไม่สะดวก และเครื่องมือบรรทัดคำสั่งก็ไม่ควรขอรหัสผ่าน ด้วยโฟลว์สำหรับอุปกรณ์ (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)