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옵션).