Skip to main content
このチュートリアルでは、Device Authorization Flow を使って、入力機能が制限されたデバイスから独自の API を呼び出す方法を学べます。このフローの仕組みや、これを使うべき理由については、Device Authorization Flowを参照してください。
Auth0 を使えば、アプリに Device を簡単に実装できます。
  • Authentication API: Auth0 の API を直接呼び出す方法については、このまま読み進めてください。対話形式で試したい場合は、Device Flow Playgroundを参照してください。

前提条件

このチュートリアルを始める前に、以下を確認してください。
  • Device Authorization Flow が実装に適していることを確認するため、制限事項 (下記) を確認します。
  • Auth0 にアプリケーションを登録します
    • アプリケーションの種類 として Native を選択します。
    • 必要に応じて Allowed Web Origins を設定します。これは、ローカル開発用に localhost をオリジンとして許可したり、CORS の対象となる特定の TV ソフトウェア (例: HTML5 + JS) に対して許可するオリジンを設定したりする場合に使用できます。ほとんどのアプリケーションでは、この設定は使用しません。
    • OIDC Conformant トグルが有効になっていることを確認します。この設定は、Auth0 Dashboardアプリケーション > アプリケーション > 詳細設定 > OAuth にあります。
    • アプリケーションの グラントタイプデバイスコード が含まれていることを確認します。方法については、グラントタイプを更新する を参照してください。
    • アプリケーションでリフレッシュトークンを使用できるようにするには、アプリケーションの グラントタイプリフレッシュトークン が含まれていることを確認します。方法については、グラントタイプを更新する を参照してください。リフレッシュトークンの詳細については、リフレッシュトークン を参照してください。
  • アプリケーション用に少なくとも 1 つの接続を設定し、有効にします: データベース接続, ソーシャル接続
  • Auth0 に API を登録します
    • API が以前のトークンの有効期限が切れたときに新しいトークンを取得できるよう、API でリフレッシュトークンを受け取れるようにするには、オフラインアクセスの許可 を有効にします。リフレッシュトークンの詳細については、リフレッシュトークン を参照してください。
  • ランダムに生成されるユーザーコードの文字セット、形式、長さを定義するため、デバイスのユーザーコード設定を構成します

手順

  1. デバイスコードをリクエストする (Device Flow): ユーザーがデバイスを認可するために使用するデバイスコードをリクエストします。
  2. デバイスのアクティベーションをリクエストする (Device Flow): ユーザーに、ノートパソコンまたはスマートフォンを使ってデバイスを認可してもらいます。
  3. トークンをリクエストする (Device Flow): トークンをリクエストするため、トークンエンドポイントをポーリングします。
  4. ユーザーがデバイスを認可する (Browser Flow): ユーザーがデバイスを認可し、デバイスがトークンを受け取れるようにします。
  5. トークンを受け取る (Device Flow): ユーザーがデバイスを正常に認可したら、トークンを受け取ります。
  6. API を呼び出す (Device Flow): 取得したアクセストークンを使用して API を呼び出します。
  7. トークンを更新する (Device Flow): 既存のトークンの有効期限が切れたときに新しいトークンをリクエストするため、リフレッシュトークンを使用します。
任意: サンプルユースケースを確認する 任意: トラブルシューティング

デバイスコードをリクエストする

ユーザーがデバイスアプリを起動してデバイスを認可しようとする場合は、デバイスコードを取得する必要があります。ユーザーがブラウザベースのデバイスでセッションを開始すると、このコードはそのセッションに関連付けられます。 デバイスコードを取得するには、アプリから device code URL にコードをリクエストし、その際に を含める必要があります。

デバイスコードURL への POST の例

デバイスコードのパラメーター
カスタム API を呼び出すためのデバイスコードをリクエストする場合は、次の点に注意してください。
  • パラメーターを含める必要があります
  • 対象の API でサポートされている追加のスコープを含めることもできます
アプリが認証済みユーザーの情報を取得するためだけにアクセストークンを必要とする場合は、audience パラメーターは不要です。

デバイスコードのレスポンス

正常に処理されると、device_codeuser_codeverification_uriexpires_inintervalverification_uri_complete の各値を含むペイロードを含む HTTP 200 レスポンスが返されます:
  • device_code はデバイスを一意に識別するコードです。ユーザーがブラウザベースのデバイスで verification_uri にアクセスすると、このコードがそのセッションに紐付けられます。
  • user_code には、デバイスを認可するために verification_uri で入力するコードが含まれます。
  • verification_uri には、デバイスを認可するためにユーザーがアクセスするURLが含まれます。
  • verification_uri_complete には、デバイスを認可するためにユーザーがアクセスする完全なURLが含まれます。これにより、必要に応じてアプリで user_code をURLに埋め込めます。
  • expires_in は、device_codeuser_code の有効期間 (秒) を示します。
  • interval は、token URL に対して token をリクエストするためにアプリがポーリングを行う間隔 (秒) を示します。
ランダムに生成される user code の文字セット、形式、長さは、テナント設定で構成できます。ブルートフォース攻撃を防ぐため、user_code には次の制限を設けています。最小長:
  • BASE20 Letters: 8文字
  • Numbers: 9文字
最大長:
  • 20文字 (読みやすくするための区切りとして追加されるハイフンとスペースを含む)
有効期限:
  • 15分

デバイスのアクティベーションをリクエストする

device_codeuser_code を受け取ったら、ユーザーにノートパソコンまたはスマートフォンで verification_uri にアクセスし、user_code を入力するよう案内する必要があります。
Auth0 Flows のデバイス認可リクエスト。user_code と QR コードの 2 つのアクティベーション方法が表示されたサンプルページ
device_code はユーザーが直接使用するものではないため、混乱を避けるために、操作中は表示しないでください。
CLI を構築する場合は、この手順を省略して、すぐに verification_uri_complete でブラウザーを開くこともできます。

トークンをリクエストする

ユーザーがデバイスを有効化するのを待つ間に、 をリクエストするため、token URL へのポーリングを開始します。前のステップで取得したポーリング間隔 (interval) を使って、device_code を含めたうえで token URLPOST する必要があります。 ネットワーク遅延によるエラーを避けるため、各間隔は、直前のポーリング リクエストへのレスポンスを受信してから数え始めてください。

token URL に token をリクエストする POST の例

トークンリクエストのパラメータ

トークン応答

ユーザーがデバイスを認可するまでの間、HTTP 4xx レスポンスがいくつか返されることがあります。
認可保留中
ユーザーが操作を完了するまで、このエラーが表示されます。このチュートリアルの前のStepで取得した推奨間隔で、ポーリングを続けてください。
速度を落とす
ポーリングの間隔が短すぎます。このチュートリアルの前のステップで取得した推奨の間隔を使用してください。ネットワーク遅延によってこのエラーが発生するのを防ぐには、最後のポーリング リクエストへのレスポンスを受信してから、次の間隔の計測を開始してください。
期限切れのトークン
ユーザーによるデバイスの認可が間に合わなかったため、device_code は期限切れになっています。アプリケーションは、フローの有効期限が切れたことをユーザーに通知し、フローを再度開始するよう促す必要があります。
expired_token エラーが返されるのは1回限りで、その後は invalid_grant が返されます。デバイスは必ずポーリングを停止してください。
アクセスが拒否されました
最後に、アクセスが拒否された場合は、以下が表示されます。
これは、たとえば次のようなさまざまな理由で発生することがあります。
  • ユーザーがデバイスの認可を拒否した
  • がトランザクションを拒否した
  • 設定されたルールによってアクセスが拒否された (詳しくは、Auth0 ルール を参照してください。)

ユーザーを認可する

ユーザーは、QRコードをスキャンするか、アクティベーションページを開いてユーザーコードを入力します。
デバイスに表示されたコードの入力をユーザーに促す Auth0 Flows Device Authorization プロンプト
続いて、このデバイスが正しいことをユーザーに確認してもらうための確認ページが表示されます。
コードの確認をユーザーに促す Auth0 Flows Device Authorization 確認プロンプトのサンプル
ユーザーはサインインしてトランザクションを完了します。この手順には、次のプロセスが1つ以上含まれる場合があります。
  • ユーザーの認証
  • 認証を処理するため、ユーザーをにリダイレクトすること
  • アクティブなセッションの確認
  • 以前に同意が得られていない場合、デバイスに対するユーザーの同意を取得すること
メールとパスワード、または Google や別のアイデンティティでログインするようユーザーに促す Auth0 Flows Device Authorization ユーザー認可プロンプト
認証と同意が正常に完了すると、確認プロンプトが表示されます。
ユーザー向けの Flows - Device Authorization - 完了通知
この時点で、ユーザーの認証が完了し、デバイスは認可されています。

トークンを受け取る

ユーザーがデバイスの認証と認可を行っている間も、デバイスアプリはアクセストークンを要求するために Token URL へのリクエストを継続的にポーリングします。 ユーザーがデバイスを正常に認可すると、access_tokenrefresh_token (省略可) 、id_token (省略可) 、token_typeexpires_in の各値を含むペイロードを伴う HTTP 200 レスポンスを受け取ります。
保存する前にトークンを検証してください。方法については、ID トークンを検証するアクセストークンを検証する を参照してください。
アクセストークンは、Auth0 Authentication API の /userinfo エンドポイント または別の API を呼び出すために使用されます。 (アクセストークンの詳細については、Access Tokens を参照してください。) アクセストークンで /userinfo を呼び出せるのは、openid scope を含めた場合のみです。独自の API を呼び出す場合、最初に必要になるのは アクセストークンを検証する ことです。 には、デコードして取り出す必要があるユーザー情報が含まれています。 (ID トークンの詳細については、ID Tokens を参照してください。) id_token がレスポンスに含まれるのは、openid scope を含めた場合のみです。 は、以前のアクセストークンまたは ID トークンの有効期限が切れたあとに、新しいアクセストークンまたは ID トークンを取得するために使用されます。 (リフレッシュトークンの詳細については、Refresh Tokens を参照してください。) refresh_token がレスポンスに含まれるのは、offline_access scope を含め、さらに Auth0 Dashboard でその API に対して オフラインアクセスの許可 を有効にしている場合のみです。
リフレッシュトークンがあれば、ユーザーの認証状態を実質的に無期限で維持できるため、安全に保管する必要があります。

API を呼び出す

API を呼び出すには、アプリケーションで取得した アクセストークン を Bearer トークンとして HTTP リクエストの Authorization ヘッダーに含める必要があります。

リフレッシュトークン

このチュートリアルに沿ってここまで進め、次の作業を完了していれば、すでにリフレッシュトークンを受け取っています。
  • API でオフラインアクセスを許可するよう設定した
  • authorize エンドポイント を通じて認証リクエストを開始する際に、offline_access スコープを含めた
リフレッシュトークンを使うと、新しいアクセストークンを取得できます。通常、ユーザーが新しいアクセストークンを必要とするのは、前のトークンの有効期限が切れた後か、新しいリソースへのアクセスを初めて取得するときだけです。API を呼び出すたびに新しいアクセストークンを取得するために毎回このエンドポイントを呼び出すのは、望ましい方法ではありません。また、Auth0 ではレート制限が設けられており、同じ IP から同じトークンを使ってそのエンドポイントに送信できるリクエスト数は制限されます。 トークンを更新するには、grant_type=refresh_token を使用して、Authentication API の /oauth/token エンドポイントに POST リクエストを送信します。

Token URL へのリフレッシュトークンの POST の例

リフレッシュトークンのリクエストパラメーター

リフレッシュトークンのレスポンス

問題がなければ、新しいaccess_tokenid_token (任意) 、トークンの有効期限 (秒) (expires_in) 、付与されたscope値、token_typeを含むペイロード付きのHTTP 200レスポンスを受け取ります。
保存する前に、トークンを検証してください。手順については、ID トークンを検証するアクセストークンを検証する をご覧ください。

使用例

Device Authorization Flow の使用を検出する

ルールを使用すると、現在のトランザクションで Device Authorization Flow が使われているかどうかを検出できます。 (ルールの詳細については、Auth0 ルール を参照してください。) その場合は、context オブジェクトの protocol プロパティを確認します。

サンプル実装

  • Device Authorization Playground
  • AppleTV (Swift): AppleTV で Device Authorization Flow を使用して Auth0 を利用する方法を示すシンプルなアプリケーションです。
  • CLI (Node.js): 認可コードフローではなく Device Authorization Flow を使用する CLI のサンプル実装です。主な違いは、CLI で Web サーバーを立ち上げてポートを待ち受ける必要がないことです。

トラブルシューティング

テナントログは、発生したあらゆる操作について作成され、問題の切り分けに利用できます。詳しくは、ログを参照してください。

エラーコード

制限事項

Device Authorization Flow を使用するには、デバイスが次の要件を満たしている必要があります。 さらに、Device Authorization Flow では次のことはサポートされていません。 を除き、Draft 15 全体をサポートしています。詳しくは、ietf.org の OAuth 2.0 Device Authorization Grant Draft 15 を参照してください。

詳細はこちら