入力制限デバイス向けOAuth 2.0デバイスコードフロー

デバイスコードグラント(RFC 8628)がスマートTV、CLIツール、入力能力が限られたIoTデバイスでOAuth 2.0認証をどのように実現するかを学びます。

Grant Types

詳細な説明

デバイス認可グラント(RFC 8628)

デバイスコードフローは、テキスト入力メカニズムが不便なデバイス(スマートTV、ゲームコンソール、プリンター、CLIツール、IoTデバイス)でOAuth 2.0認証を可能にします。デバイス自体に資格情報を入力する代わりに、フルブラウザを持つ別のデバイスでユーザーが認証を完了します。

仕組み

  1. デバイス認可リクエスト: デバイスがclient_idと希望するscope/device/codeにPOSTを送信。

  2. デバイスコードレスポンス: サーバーがdevice_code、短い人間が読めるuser_codeverification_uri、ポーリングintervalを返します。

  3. ユーザーへの指示: デバイスがuser_codeverification_uriをユーザーに表示(例:「https://example.com/device にアクセスしてコード: WDJB-MJHT を入力してください」)。

  4. ユーザー認可: ユーザーが電話やラップトップでURLにアクセスし、コードを入力してログインし、同意を付与。

  5. ポーリング: デバイスは指定された間隔でgrant_type=urn:ietf:params:oauth:grant-type:device_codeを使用して/tokenエンドポイントをポーリング。

  6. アクセストークン: ユーザーが認可を完了すると、次のポーリングでアクセストークンが返されます。それまでサーバーはauthorization_pendingまたはslow_downエラーで応答。

ポーリングレスポンス

エラー 意味
authorization_pending ユーザーがまだ認可を完了していない — ポーリングを継続
slow_down ポーリングが速すぎる — 間隔を5秒増やす
expired_token デバイスコードの有効期限切れ — 最初からやり直し
access_denied ユーザーがリクエストを拒否

セキュリティに関する考慮事項

  • ブルートフォース推測を防ぐために高エントロピーのユーザーコードを使用
  • ポーリングエンドポイントにレート制限を実装
  • デバイスコードに適切な有効期限を設定(10-15分)
  • 検証URIを明確にユーザーに表示

ユースケース

ユーザーにログインを要求するスマートTVストリーミングアプリケーション(NetflixやYouTubeなど)。TVが短いコードとURLを表示します。ユーザーが携帯電話でURLを開き、コードを入力してログインします。認可が完了するとTVが自動的にアクセストークンを受信します。

試してみる — OAuth 2.0 Flow Visualizer

フルツールを開く