このチュートリアルでは、デバイス認可フローを使用して、入力に制約のあるデバイスから独自のAPIを呼び出します。フローの仕組みやメリットについては、「デバイス認可フロー」を参照してください。
- Authentication API:APIを直接呼び出す方法については、このまま続けてお読みください。インタラクティブエクスペリエンスについては、「デバイスフロープレイグラウンド」をお読みください。
前提条件
このチュートリアルを始める前に:- 制限事項(下記)を確認して、デバイス認可フローが実装に適しているかどうかを確認してください。
-
Auth0にアプリケーションを登録します。
- [Application Type(アプリケーションタイプ)] として [Native(ネイティブ)] を選択します。
- 必要な場合は、[Allowed Web Origins(許可されたWebオリジン)] を設定します。これを使用して、ローカル開発のオリジンとしてlocalhostを許可したり、CORSの対象となるアーキテクチャ(例:HTML5+JS)を持つ特定のTVソフトウェアの許可されたオリジンを設定したりできます。ほとんどのアプリケーションはこの設定は使用しません。
- [OIDC Conformant(OIDC準拠)] トグルが有効になっていることを確認します。この設定は[Dashboard]の [Applications(アプリケーション)]>[Application(アプリケーション)]>[Advanced Settings(アプリケーション設定)]>[OAuth] にあります。
- アプリケーションの [Grant Types(付与タイプ)] に [Device Code(デバイスコード)] が含まれていることを確認します。詳細については、「付与タイプを更新する」をお読みください。
- アプリケーションがリフレッシュトークンを使用できるようにするには、アプリケーションの [Grant Types(付与タイプ)] に [Refresh Token(リフレッシュトークン)] が含まれていることを確認します。詳細については、「付与タイプを更新する」をお読みください。リフレッシュトークンの詳細については、「リフレッシュトークン」をお読みください。
- アプリケーションに少なくとも次の1つの接続をセットアップして有効にします:データベース接続、ソーシャル接続
-
APIをAuth0に登録します。
- APIがリフレッシュトークンを受信して、トークンの有効期限が切れたときに新しいトークンを取得できるようにするには、[Allow Offline Access(オンラインでのアクセスを許可する)] を有効にします。リフレッシュトークンの詳細については、「リフレッシュトークン」をお読みください。
- デバイスのユーザーコードの設定を構成して、ランダムに生成されたユーザーコードの文字セット、形式、長さを定義します。
手順
- デバイスコードの要求(デバイスフロー):ユーザーがデバイスを認可するために使用できるデバイスコードを要求します。
- デバイスのアクティベーションの要求(デバイスフロー):ユーザーにノートパソコンまたはスマートフォンを使用してデバイスを認可するよう要求します。
- トークンの要求(デバイスフロー):トークンエンドポイントをポーリングし、トークンを要求します。
- ユーザーの認可(ブラウザフロー):デバイスがトークンを受け取れるように、ユーザーがデバイスを認可します。
- トークンの受け取り(デバイスフロー):ユーザーがデバイスを正常に認可すると、トークを受け取ります。
- APIの呼び出し(デバイスフロー):取得したアクセストークンを使ってAPIを呼び出します。
- トークンのリフレッシュ(デバイスフロー):既存のトークンが期限切れになったら、リフレッシュトークンを使用して新しいトークンを要求します。
デバイスコードを要求する
ユーザーがデバイスアプリを起動し、デバイスを認可したい場合は、デバイスコードを取得する必要があります。ユーザーがブラウザベースのデバイスでセッションを開始すると、このコードはそのセッションにバインドされます。 デバイスコードを取得するには、アプリがクライアントIDを含むデバイスコードURLからコードを要求する必要があります。デバイスコードに対するPOSTの例URL
デバイスコードのパラメーター
カスタムAPIを呼び出すためのデバイスコードを要求するときは、以下のことにご注意ください。- オーディエンスパラメーターを含めなければなりません
- ターゲットAPIによってサポートされている追加のスコープを含めなければなりません
アプリで、認証されたユーザーに関する情報の取得にアクセストークンのみが必要な場合は、オーディエンスパラメーターは必要ありません。
パラメーター名 | 説明 |
---|---|
client_id | アプリケーションのクライアントIDです。この値は[Application Settings(アプリケーション設定)]にあります。 |
scope | 認可を要求するスコープです。スペースで区切る必要があります。profile やemail など、ユーザーに関する標準OIDCスコープ、名前空間形式に従ったカスタムクレーム、ターゲットAPIがサポートするスコープ(例:read:contacts )を要求できます。IDトークンの取得や、/userinfoエンドポイントを使ってユーザープロファイル情報を取得する際には、openid を含めます。リフレッシュトークンを取得するにはoffline_access を含めます([API Settings(API設定)]で__[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
を使って直接ブラウザーを開くことができます。トークンを要求する
ユーザーがデバイスを有効にするのを待っている間に、トークンURLのポーリングを開始してアクセストークンを要求します。前のステップで抽出したポーリング間隔(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。この値はアプリケーション設定で確認できます。 |
トークンの応答
ユーザーがデバイスを認可するのを待っている間に、いくつかの異なるHTTP 4xx
応答を受け取る場合があります。
認可待ち
このエラーは、ユーザーの操作を待っている間に表示されます。このチュートリアルの前の手順で推奨されているintervalを使ってポーリングを継続してください。減速
ポーリングが速すぎます。このチュートリアルの前の手順で推奨されている間隔を使ってポーリングしてください。ネットワーク遅延が原因でこのエラーを受け取ることを避けるには、ポーリング要求の応答を受け取ってから間隔をカウントし始めるようにします。有効期限切れのトークン
ユーザーがデバイスをすぐに認可しなかったため、「device_code」の有効期限が切れました。アプリケーションはユーザーにフローの失効を通知して、フローをもう一度始めるように促す必要があります。expired_token
エラーは1回だけ返されます。その後、invalid_grant
が返されます。お使いのデバイスがポーリングを停止しなければなりません 。アクセスが拒否されました
最後に、アクセスが拒否された場合は、次のメッセージが表示されます。- ユーザーがデバイスの認可を拒否した
- 認可サーバーがトランザクションを拒否した
- 構成されたルールによってアクセスが拒否された(詳細については、「Auth0ルール」をお読みください)
ユーザーを認可する
ユーザーはQRコードをスキャンするか、アクティベーションページを開いてユーザーコードを入力します:

- ユーザーを認証する
- 認証を行うために、ユーザーをIDプロバイダーへリダイレクトする
- アクティブなセッションをチェックする
- 事前に同意が得られていない場合、デバイスに対するユーザーの同意を取得する


トークンを受け取る
ユーザーが認証とデバイスの認可を行っている間、デバイスアプリはトークンURLをポーリングしてアクセストークンを要求し続けます。 ユーザーが正常にデバイスの認可を行った場合、access_token
、refresh_token
(任意)、id_token
(任意)、token_type
、およびexpires_in
値を含むペイロードを持つHTTP 200
応答を受け取ります。
トークンは、検証してから保存します。操作方法については、「IDトークンの検証」および「アクセストークンを検証する」を参照してください。
/userinfo
エンドポイントや他のAPIを呼び出すために使用されます(アクセストークンの詳細については、「アクセストークン」を参照してください)。openid
スコープを含めた場合にのみ、アクセストークンを使用して/userinfo
を呼び出すことができます。独自のAPIを呼び出す場合に、APIがまず実行しなければならいことは、アクセストークンを検証することです。
IDトークンにはデコードして抽出するべきユーザー情報が含まれています(IDトークンの詳細については、「IDトークン」をお読みください)。id_token
はopenid
スコープを含めた場合にのみ応答で返されます。
リフレッシュトークンは、トークンの有効期限が切れた後に、新しいアクセストークンまたはIDトークンを取得するために使用されます(リフレッシュトークンの詳細については、「リフレッシュトークン」をお読みください)。refresh_token
は、offline_access
スコープを含めて、DashboardでAPIの**[Allow Offline Access(オンラインでのアクセスを許可する)]** を有効にした場合にのみ応答で返されます。
リフレッシュトークンは、ユーザーが実質的に永久に認証された状態を維持できるようにするため、安全に保管しなければなりません。
APIを呼び出す
APIを呼び出すには、アプリケーションは、取得したアクセストークンをベアラートークンとしてHTTP要求の認証ヘッダーで渡さなければなりません。リフレッシュトークン
このチュートリアルに従って次の操作を完了している場合は、すでにリフレッシュトークンを受け取っています。- オフラインアクセスを許可するように、APIを構成する。
- 認可エンドポイントを通じて認証要求を開始するときに
offline_access
スコープを含める。
grant_type=refresh_token
を使用して、認証APIの/oauth/token
エンドポイントに対してPOST
要求を行います。
トークンURLに対するリフレッシュトークンのPOST要求の例
リフレッシュトークン要求パラメーター
パラメーター | 説明 |
---|---|
grant_type | これを”refresh_token”に設定します。 |
client_id | アプリケーションのクライアントIDです。この値は[Application Settings(アプリケーションの設定)]にあります。 |
client_secret | アプリケーションのクライアントシークレットでし。この値は[Application Settings(アプリケーションの設定)]にあります。 |
refresh_token | 使用するリフレッシュトークンです。 |
scope | (任意)要求された権限スコープのスペース区切りのリストです。送信されない場合は、元のスコープが使用されます。それ以外の場合は、スコープの数を減らして要求できます。URLエンコードが必要です。 |
リフレッシュトークンの応答
すべてがうまくいけば、HTTP 200
応答がペイロードに新しいaccess_token
、id_token
(任意)、秒単位のトークン有効期間(expires_in
)、付与されたscope
の値、token_type
を含めて返されます。
トークンは、検証してから保存します。操作方法については、「IDトークンの検証」および「アクセストークンを検証する」を参照してください。
サンプルユースケース
デバイス認可フローの使用を検出する
ルールを使用して、現在のトランザクションがデバイス認可フローを使用しているかを検出できます(ルールの詳細については、「Auth0ルール」をお読みください)。これを行うには、context
オブジェクトのprotocol
プロパティを確認します。
実装例
- デバイス認可プレイグラウンド
- AppleTV(Swift):AppleTVからのデバイス認可フローにAuth0を使用できることを示す簡素なアプリケーションです。
- CLI(Node.js):認可コードフローではなく、デバイス認可フローを使用するCLIの実装例です。CLIではWebサーバーをホストしてポートを待ち受ける必要がない点で大きく異なります。
トラブルシューティング
テナントログは実行されるあらゆるやり取りを記録するため、問題の解決に利用できます。詳細については、「ログ」をお読みください。エラーコード
コード | 名前 | 説明 |
---|---|---|
fdeaz | デバイス認可要求の失敗 | |
fdeac | デバイス有効化の失敗 | |
fdecc | ユーザーがデバイス確認をキャンセル | |
fede | 交換の失敗 | アクセストークンのデバイスコード |
sede | 交換の成功 | アクセストークンのデバイスコード |
制限事項
デバイス認可フローを使用するには、デバイスが次の要件を満たす必要があります。- カスタムドメインの使用にServer Name Indication(SNI)をサポートしている
- Auth0アプリケーションタイプが [Native(ネイティブ)] である
- トークンエンドポイントの認証方法が [None(なし)] に設定されている
- OIDCに準拠している
- 動的クライアント登録(Dynamic Client Registration)で作成されていない
- ソーシャル接続にAuth0開発者キーを使用する(ユニバーサルログインエクスペリエンスを使用していない場合)
- クエリ文字列パラメーターへのアクセスをホスト済みのログインページまたはルールから行う
- ユーザーアカウントをリンクする