入力制限デバイス向けOAuth 2.0デバイスコードフロー
デバイスコードグラント(RFC 8628)がスマートTV、CLIツール、入力能力が限られたIoTデバイスでOAuth 2.0認証をどのように実現するかを学びます。
詳細な説明
デバイス認可グラント(RFC 8628)
デバイスコードフローは、テキスト入力メカニズムが不便なデバイス(スマートTV、ゲームコンソール、プリンター、CLIツール、IoTデバイス)でOAuth 2.0認証を可能にします。デバイス自体に資格情報を入力する代わりに、フルブラウザを持つ別のデバイスでユーザーが認証を完了します。
仕組み
デバイス認可リクエスト: デバイスが
client_idと希望するscopeで/device/codeにPOSTを送信。デバイスコードレスポンス: サーバーが
device_code、短い人間が読めるuser_code、verification_uri、ポーリングintervalを返します。ユーザーへの指示: デバイスが
user_codeとverification_uriをユーザーに表示(例:「https://example.com/device にアクセスしてコード: WDJB-MJHT を入力してください」)。ユーザー認可: ユーザーが電話やラップトップでURLにアクセスし、コードを入力してログインし、同意を付与。
ポーリング: デバイスは指定された間隔で
grant_type=urn:ietf:params:oauth:grant-type:device_codeを使用して/tokenエンドポイントをポーリング。アクセストークン: ユーザーが認可を完了すると、次のポーリングでアクセストークンが返されます。それまでサーバーは
authorization_pendingまたはslow_downエラーで応答。
ポーリングレスポンス
| エラー | 意味 |
|---|---|
authorization_pending |
ユーザーがまだ認可を完了していない — ポーリングを継続 |
slow_down |
ポーリングが速すぎる — 間隔を5秒増やす |
expired_token |
デバイスコードの有効期限切れ — 最初からやり直し |
access_denied |
ユーザーがリクエストを拒否 |
セキュリティに関する考慮事項
- ブルートフォース推測を防ぐために高エントロピーのユーザーコードを使用
- ポーリングエンドポイントにレート制限を実装
- デバイスコードに適切な有効期限を設定(10-15分)
- 検証URIを明確にユーザーに表示
ユースケース
ユーザーにログインを要求するスマートTVストリーミングアプリケーション(NetflixやYouTubeなど)。TVが短いコードとURLを表示します。ユーザーが携帯電話でURLを開き、コードを入力してログインします。認可が完了するとTVが自動的にアクセストークンを受信します。