דילוג לתוכן
תיעוד · טלוויזיות וכלי שורת פקודה

טלוויזיות, קונסולות וכלי שורת פקודה

לטלוויזיה לא קל להציג דף התחברות, וכלי שורת פקודה לא אמור לבקש סיסמה. בזרימת המכשיר, המכשיר מציג קוד קצר, והאדם מקליד אותו ב-Lobby של הסביבה בטלפון או במחשב שלו, שבהם הוא כבר מחובר.

רישום האפליקציה

ב-Usher Console, פותחים את הסביבה ועוברים אל אפליקציות ← אפליקציה חדשה ← טלוויזיה או שורת פקודה. האפליקציה מקבלת מזהה לקוח ולא מקבלת סוד: מכשיר לא יכול לשמור עליו.

הזרימה

מסוף
# 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).