본문으로 건너뛰기
문서 · TV 및 명령줄 도구

TV, 게임 콘솔, 명령줄 도구

TV는 로그인 페이지를 표시하기 어렵고, 명령줄 도구는 암호를 묻지 않는 것이 좋습니다. 기기 흐름을 사용하면 기기에 짧은 코드가 표시되고, 사용자는 이미 로그인되어 있는 휴대전화나 컴퓨터에서 환경의 Lobby에 그 코드를 입력합니다.

앱 등록하기

Usher Console에서 환경을 열고 애플리케이션 → 새 애플리케이션 → TV 또는 명령줄로 이동하세요. 앱에는 클라이언트 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은 10분이 지났다는 뜻입니다. 새 코드를 요청하세요.
  • 주소도 함께 보여 주세요. 모두가 QR 코드를 스캔할 수 있는 것은 아닙니다. verification_uri와 함께 코드를 6L95-PBQQ처럼 나누어 표시하세요.

Lobby는 /device에서 어떤 앱이 무엇을 요청하는지 사용자에게 보여 줍니다. 그리고 사용자가 직접 시작했고 기기에 같은 코드가 표시되어 있을 때만 계속하라고 안내합니다.

토큰을 기기에 묶기(DPoP)

기기에서 복사해 간 토큰도 여전히 토큰입니다. DPoP(RFC 9449)를 사용하면 기기가 개인 키를 보관하고, 요청할 때마다 새로 서명한 증명을 함께 보냅니다. 그 키에 묶인 토큰은 키 없이는 쓸모가 없습니다.

  • 바인딩된 토큰 요청하기: 토큰 요청에 DPoP 헤더를 보내면, Usher가 발급하는 토큰을 그 키에 묶습니다(token_type이 DPoP입니다).
  • 필수로 설정하기: 앱을 만들 때 DPoP 필수를 켜세요. 그러면 Usher는 증명 없이는 그 앱에 토큰을 발급하지 않습니다.
  • 사용하기: Authorization: DPoP <token>과 함께 해당 요청에 대한 증명을 보내세요.
  • 라이브러리: DPoP를 지원하는 대부분의 OAuth 라이브러리가 이 모든 작업을 대신 처리합니다(예: openid-client의 DPoP 옵션).