デバイス・コード権限付与タイプ

この権限付与タイプは、データの入力方法が簡単ではないデバイス(ゲーム・コンソール、ストリーミング・メディア・プレーヤ、デジタル画像フレームなど)でクライアントが実行され、クライアントで認可サーバーからの受信リクエスト受信できない場合に使用します。

たとえば、顧客がRoku、デジタル画像フレームまたはゲーム・コンソールを購入したとします。顧客は、映画、画像またはゲームをクラウドからフェッチするには、アクセス・トークンが必要になります。クライアントは、ユーザーのストリーミング・メディア・プレーヤ(Rokuなど)またはデジタル画像フレームと対話するかわりに、別のコンピュータまたはデバイス(デスクトップ・コンピュータ、スマートフォンまたはタブレット)を使用して、認可サーバーに接続し、アクセス・リクエストを承認するようにユーザーに指示します。クライアントは受信リクエストを受信することができないため、ユーザーが承認プロセスを完了するまで認可サーバーを繰り返しポーリングします。

次のダイアグラムに、デバイス・コード権限付与タイプのフローを示します。

デバイス・コード権限付与タイプのフローを示す図。

このOAuthフローでは、次のようになります。

ノート

このデバイス・フローでは、クライアント・シークレットを使用してデバイス・コードおよびユーザー・コードを取得することはありません。クライアント・シークレットは、アクセス・トークンの取得時に使用されます(クライアントに割り当てられている場合)。
  1. デバイス・クライアントは、アイデンティティ・ドメインの/deviceエンドポイントに対して未認証リクエストを作成します。デバイスは、デバイス・コード、ユーザー・コードおよび検証URIを受信します。

    デバイス・クライアントは、ユーザーにユーザー・コード(user_code)を表示し、ユーザーがユーザー・コードを入力するために必要なURL (verification-uri)を提供します(図には示されていません)。

  2. デバイスクライアントは、ユーザーが承認されているかどうかを知りません。デバイス・クライアントは、ユーザーが検証ページでユーザー・コードを入力するまで、アクセス・トークンをバックグラウンドでoauth2/v1/token)に繰り返しリクエストします。

  3. ユーザーは確認ページにアクセスしてサインインし、ユーザー・コードを入力します。

  4. ユーザーがユーザー・コードを入力し、アクセスを認可すると、OAuthサーバーによってアクセス・トークンが発行され、ユーザーにはデバイスを介して、保護されたデータへのアクセス権が付与されます。

機能 使用可能
ブラウザベースのエンド・ユーザーとの対話 はい
認証のために外部アイデンティティ・プロバイダの使用が可能 はい
リフレッシュ・トークンを許可 はい

「デバイス・コード権限付与タイプの認可フローの例」を参照してください。

デバイス・コード付与タイプの認可フローの例

デバイス・コード付与タイプは、データ入力方法(ゲーム・コンソール、ストリーミング・メディア・プレーヤ、デジタル・ピクチャ・フレームなど)が簡単でないデバイス上でデバイス・クライアントが実行され、認可サーバーから受信リクエストを受信できない特定の付与フローを提供します。

デバイス・クライアントを介して、保護されたリソースにアクセスするためのアクセス・トークンを取得するには、デバイス・クライアントと直接対話するかわりに、デバイス・クライアントが別のコンピュータまたはデバイスを使用して認可サーバーに接続し、アクセス・リクエストを承認するようにユーザーに指示します。デバイス・クライアントは、ユーザーが承認プロセスを完了するまで、認可サーバーを繰り返しポーリングします。

アイデンティティ・ドメイン・コンソールでデバイス・コード権限付与タイプを使用してアプリケーションを作成する場合は、権限付与タイプとして「デバイス・コード」を選択します。

デバイス・コード権限付与タイプおよび権限フロー図の詳細は、「デバイス・コード権限付与タイプ」を参照してください。

認可フロー

  1. デバイス・クライアントは、認証されていないリクエストを/oauth2/v1/deviceエンドポイントに対して実行します。

    イベントURLには、リクエストされているアクセスのタイプを示す問合せパラメータが含まれます。

    リクエストの例

       curl -i -k 
       -H 'Authorization: application/x-www-form-urlencoded; charset=utf-8'
       --request POST 'https://<domainURL>/oauth2/v1/device'
       -d 'response_type=device_code&scope=http://example.com/quotes&client_id=<client-id>'
  2. レスポンスには、OAuthクライアント・アプリケーションからのデバイス・コード、ユーザー・コードおよび検証URIが含まれます。

    レスポンスの例

    { 
    "expires_in": 300, 
    "device_code": "4d03f7bc-f7a5-4795-819a-5748c4801d35", 
    "user_code": "SDFGHJKL",
    "verification_uri": "http://<domainURL>/ui/v1/device" 
    }
  3. デバイスには、ユーザー・コード(user_code)が表示され、ユーザーがユーザー・コードを入力するために必要なURL (validation-uri)が提供されます。

  4. デバイスクライアントアプリケーションは、ユーザーが承認されているかどうかを知りません。ユーザーがクライアントのリクエストを認可(または拒否)している間、クライアントはトークン・エンドポイント(oauth2/v1/token)で認可サーバーを繰り返しポーリングして、ユーザーの認可ステップが完了したかどうかを確認します。クライアントは、リクエストに検証コードとそのクライアント識別子を含めます。

    リクエストの例: 機密クライアント

       curl -i -k 
       -H 'Authorization: application/x-www-form-urlencoded; charset=utf-8' 
       -H 'Authorization: Basic <base64 clientid:secret> 
       --request POST 'https://<domainURL>/oauth2/v1/token'
       -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=4d03f7bc-f7a5-4795-819a-5748c4801d35'

    リクエストの例: パブリック・クライアント

       curl -i -k 
       -H 'Authorization: application/x-www-form-urlencoded; charset=utf-8' 
       --request POST 'https://<domainURL>/oauth2/v1/token'
       -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id=3e51760ceb1245b7b77d0b1ff280bb72&device_code=4d03f7bc-f7a5-4795-819a-5748c4801d35'

    クライアント・アサーションを使用したリクエストの例

       curl -i -k 
       -H 'Authorization: application/x-www-form-urlencoded; charset=utf-8' 
       --request POST 'https://<domainURL>/oauth2/v1/token'
       -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=<clientAssertion>&device_code=4d03f7bc-f7a5-4795-819a-5748c4801d35'

    SAMLアサーションを使用するリクエストの例

       curl -i -k 
       -H 'Authorization: application/x-www-form-urlencoded; charset=utf-8' 
       --request POST 'https://<domainURL>/oauth2/v1/token'
       -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Asaml2-bearer&client_assertion=<samlAssertion>&device_code=4d03f7bc-f7a5-4795-819a-5748c4801d35'

    mTLSを使用したリクエストの例

    secureDomainURLの取得方法については、「アクセス権限タイプ」を参照してください。

    curl -v \
    --cert cert.crt \
    --key key.key \
    --cacert ca.crt \
    --location '<secureDomainURL>/oauth2/v1/token' \
    --header 'Authorization: Basic <base64Encoded clientid:secret>'
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id=<client-id>' \
    --data-urlencode 'scope=urn:opc:idm:_myscopes_'
  5. ユーザーがユーザー・コードを入力してアクセスを認可すると、OAuth認可サーバーはユーザーを認証し、リクエスト先のクライアント・アプリケーションで付与されたアプリケーション・ロールによって表される権限に基づいて、適用可能なすべてのスコープを含むアクセス・トークンを返します。
  6. リクエスト元のデバイス・クライアントは、APIコールのアクセス・トークンを使用して、保護されたデータを取得します。