このチュートリアルでは、デバイス認可フローを使用して、入力機能が制限されたデバイスから独自のAPIを呼び出す方法を説明します。このフローの仕組みや、これを使用すべき理由について詳しくは、デバイス認可フローを参照してください。
- Authentication API: API を直接呼び出す方法については、このまま読み進めてください。インタラクティブに試すには、デバイスフロー・プレイグラウンドを参照してください。
前提条件
- 制限事項 (以下) を確認し、デバイス認可フローが実装に適していることを確認してください。
-
アプリケーションを Auth0 に登録します。
- Application Type で Native を選択します。
- 必要に応じて、Allowed Web Origins を設定します。これは、ローカル開発時に localhost をオリジンとして許可したり、CORS の制約を受けるアーキテクチャの特定の TV ソフトウェア (例: HTML5 + JS) に対して許可するオリジンを設定したりするために使用できます。ほとんどのアプリケーションでは、この設定は不要です。
- OIDC 準拠 トグルが有効になっていることを確認します。この設定は、Dashboard の Applications > Application > Advanced Settings > OAuth にあります。
- アプリケーションの Grant Types に Device Code が含まれていることを確認します。手順については、Update Grant Types を参照してください。
- アプリケーションでリフレッシュトークンを使用できるようにする場合は、アプリケーションの Grant Types に Refresh Token が含まれていることを確認します。手順については、Update Grant Types を参照してください。リフレッシュトークンの詳細については、Refresh Tokens を参照してください。
- アプリケーションに対して少なくとも 1 つの接続を設定し、有効にします: データベース接続, ソーシャル接続
-
API を Auth0 に登録します
- API が以前のトークンの有効期限が切れた際に新しいトークンを取得できるよう、リフレッシュトークンを受け取れるようにしたい場合は、Allow Offline Access を有効にします。リフレッシュトークンの詳細については、Refresh Tokens を参照してください。
- デバイスユーザーコード設定を構成します。これにより、ランダムに生成されるユーザーコードの文字セット、形式、長さを定義できます。
手順
- デバイスコードをリクエストする (デバイスフロー) : ユーザーがデバイスを認可する際に使用するデバイスコードをリクエストします。
- デバイスのアクティベーションをリクエストする (デバイスフロー) : ユーザーに、ラップトップまたはスマートフォンを使用してデバイスを認可するよう求めます。
- トークンをリクエストする (デバイスフロー) : トークンを取得するために、トークンエンドポイントをポーリングします。
- ユーザーを認可する (ブラウザフロー) : ユーザーがデバイスを認可し、デバイスがトークンを受け取れるようにします。
- トークンを受け取る (デバイスフロー) : ユーザーがデバイスの認可に成功すると、トークンを受け取ります。
- API を呼び出す (デバイスフロー) : 取得したアクセストークンを使用して API を呼び出します。
- トークンを更新する (デバイスフロー) : 既存のトークンの有効期限が切れたら、リフレッシュトークンを使用して新しいトークンをリクエストします。
デバイスコードをリクエストする
デバイスコード URL への POST の例
デバイスコードのパラメーター
- パラメーターを含める必要があります
- 対象 API でサポートされている追加のスコープを含めることができます
認証済みユーザーの情報を取得するためだけにアプリでアクセストークンが必要な場合は、audience パラメーターは不要です。
| パラメーター名 | 説明 |
|---|---|
client_id | アプリケーションのクライアントIDです。この値は Application Settings で確認できます。 |
scope | 認可をリクエストする スコープ です。各値はスペースで区切る必要があります。profile や email などのユーザーに関する 標準 OIDC スコープ、名前空間形式 に準拠した カスタムクレーム、または 対象 API でサポートされている任意のスコープ (例: read:contacts) をリクエストできます。IDトークンを取得する場合、またはユーザーのユーザープロファイル情報を取得するために /userinfo エンドポイント を使用できるようにする場合は、openid を含めてください。リフレッシュトークンを取得するには、offline_access を含めます (API Settings で Allow Offline Access フィールドが有効になっていることを確認してください) 。この値は URL エンコードする必要があります。 |
audience | アプリがアクセスする API の一意の識別子です。このチュートリアルの前提条件として作成した API の Settings タブにある Identifier の値を使用してください。この値は URL エンコードする必要があります。 |
デバイスコードのレスポンス
device_code、user_code、verification_uri、expires_in、interval、verification_uri_complete の各値を含むペイロードを含む HTTP 200 レスポンスを受け取ります。
device_codeはデバイス固有のコードです。ユーザーがブラウザーを利用できるデバイスでverification_uriにアクセスすると、このコードがそのセッションに紐付けられます。user_codeには、デバイスを認可するためにverification_uriで入力するコードが含まれます。verification_uriには、デバイスを認可するためにユーザーがアクセスするURLが含まれます。verification_uri_completeには、デバイスを認可するためにユーザーがアクセスする完全なURLが含まれます。これにより、必要に応じてアプリでURLにuser_codeを埋め込めます。expires_inは、device_codeとuser_codeの有効期間 (秒) を示します。intervalは、トークンをリクエストするためにアプリがトークンURLをポーリングする間隔 (秒) を示します。
テナント設定では、ランダムに生成されるユーザーコードの文字セット、形式、長さを設定できます。総当たり攻撃を防ぐため、
user_code には次の制限が適用されます。最小長:- BASE20 の文字: 8 文字
- 数字: 9 文字
- 20 文字 (読みやすくするための区切りとして追加されるハイフンとスペースを含む)
- 15 分
デバイスのアクティベーションを依頼する
device_code と user_code を受け取ったら、ユーザーにノートパソコンまたはスマートフォンで verification_uri にアクセスし、user_code を入力するよう案内する必要があります。

device_code はユーザーが直接使用するものではないため、混乱を避けるために、この操作中は表示しないでください。
CLI を構築している場合は、この手順を省略し、すぐに
verification_uri_complete でブラウザーを開くこともできます。トークンをリクエストする
interval) を使用して、device_code を送信し、トークンURL に POST する必要があります。
ネットワーク遅延によるエラーを避けるため、各間隔の計測は、直前のポーリングリクエストへのレスポンスを受信してから開始してください。
トークンURLに対してトークンをリクエストするPOSTの例
トークンリクエストのパラメーター
| パラメーター名 | 説明 |
|---|---|
grant_type | これを “urn:ietf:params:oauth:grant-type:device_code” に設定します。これは拡張グラントタイプです (RFC6749 のセクション 4.5 で定義) 。なお、URL エンコードが必要です。 |
device_code | このチュートリアルの前の手順で取得した device_code です。 |
client_id | アプリケーションのクライアントIDです。この値は Application Settings で確認できます。 |
トークンのレスポンス
HTTP 4xx 応答がいくつか返されることがあります。
このエラーは、ユーザーの操作を待っている間に表示されます。このチュートリアルの前の手順で取得した推奨間隔で、ポーリングを続けてください。
間隔を空けてください
期限切れのトークン
device_code の有効期限が切れています。アプリケーションは、フローの有効期限が切れたことをユーザーに通知し、フローを開始し直すよう促す必要があります。
アクセス拒否
- ユーザーがデバイスの認可を拒否した
- がトランザクションを拒否した
- 設定された Rule によってアクセスが拒否された (詳しくは、Auth0 Rules を参照してください。)


- ユーザーの認証
- 認証を処理するための、ユーザーの へのリダイレクト
- アクティブな セッションの確認
- 以前に同意が与えられていない場合の、デバイスに対するユーザー同意の取得


トークンの受信
access_token、refresh_token (省略可能) 、id_token (省略可能) 、token_type、expires_in の各値を含むペイロードを伴う HTTP 200 レスポンスを受信します。
/userinfo エンドポイント または別の API を呼び出すために使用します。 (アクセストークンの詳細については、アクセストークン を参照してください。) openid スコープを含めた場合にのみ、アクセストークンを使用して /userinfo を呼び出せます。独自の API を呼び出す場合、最初に行う必要があるのは、API で アクセストークンを検証する ことです。
には、デコードして取り出す必要があるユーザー情報が含まれています。 (IDトークンの詳細については、IDトークン を参照してください。) id_token は、openid スコープを含めた場合にのみレスポンスに含まれます。
は、以前のアクセストークンまたは IDトークン の有効期限が切れた後に、新しいアクセストークンまたは IDトークン を取得するために使用されます。 (リフレッシュトークンの詳細については、リフレッシュトークン を参照してください。) refresh_token は、offline_access スコープを含め、Dashboard で API の Allow Offline Access を有効にした場合にのみレスポンスに含まれます。
API を呼び出す
リフレッシュトークン
- オフラインアクセスを許可するように API を設定した
- 認可エンドポイント を介して認証リクエストを開始する際に、
offline_accessスコープを含めた
grant_type=refresh_token を使用して、Authentication API の /oauth/token エンドポイントに POST リクエストを送信します。
トークンURLにリフレッシュトークンをPOSTする例
リフレッシュトークンのリクエストパラメーター
| パラメーター名 | 説明 |
|---|---|
grant_type | "refresh_token" に設定します。 |
client_id | アプリケーションのクライアントIDです。この値は Application Settings で確認できます。 |
client_secret | アプリケーションのクライアントシークレットです。この値は Application Settings で確認できます。 |
refresh_token | 使用するリフレッシュトークンです。 |
scope | (任意) 要求するスコープのスペース区切りリストです。送信しない場合は元のスコープが使用されます。送信した場合は、より限定されたスコープのセットを要求できます。なお、URL エンコードが必要です。 |
リフレッシュトークンのレスポンス
access_token、id_token (省略可) 、トークンの有効期間 (秒) (expires_in) 、付与された scope 値、および token_type を含むペイロードとともに、HTTP 200 レスポンスが返されます。
使用例
context オブジェクトの protocol プロパティを確認します。
サンプル実装
- デバイス認可プレイグラウンド
- AppleTV (Swift): AppleTV でデバイス認可フローを使用して Auth0 を利用する方法を示すシンプルなアプリケーションです。
- CLI (Node.js): Authorization Code Flow の代わりにデバイス認可フローを使用する CLI のサンプル実装です。主な違いは、CLI では Web サーバーをホストしてポートで待ち受ける必要がないことです。
トラブルシューティング
エラーコード
| Code | 名前 | 説明 |
|---|---|---|
fdeaz | デバイス認可リクエストの失敗 | |
fdeac | デバイス有効化の失敗 | |
fdecc | ユーザーによるデバイス確認のキャンセル | |
fede | 交換の失敗 | デバイスコードをアクセストークンに交換 |
sede | 交換の成功 | デバイスコードをアクセストークンに交換 |
制限事項
- カスタムドメイン を使用する場合は、Server Name Indication (SNI) をサポートしていること
- Auth0 application type が Native であること
- Token Endpoint Authentication Method が None に設定されていること
- OIDC-conformant であること
- Dynamic Client Registration で作成されていないこと
- Universal Login experience を使用している場合を除き、Auth0 developer keys を使用する ソーシャル接続
- ホスト型ログインページ、Rules、または Actions からのクエリ文字列パラメーターへのアクセス
- ユーザーアカウントのリンク