OAuth 2を使用したREST APIへのアクセス

アイデンティティ・ドメインREST APIでは、標準SCIM 2.0コア・スキーマおよびOracleスキーマ拡張を使用するSCIM 2.0準拠のエンドポイントをサポートして、ユーザー、グループ、アプリケーションおよびアイデンティティ機能(パスワード管理、管理タスクなど)をプログラムで管理します。アイデンティティ・ドメインへのREST APIコールを行うには、認可に使用するOAuth2アクセス・トークンが必要になります。アクセス・トークンによって、クライアント・アプリケーションがアイデンティティ・ドメインでタスクを実行するために使用するセッション(スコープおよび有効期限あり)が提供されます。

次のシーケンス図は、アイデンティティ・ドメインREST APIにアクセスするためのOAuth 2.0認可フローの基本例を示したものです。

アイデンティティ・ドメインREST APIにアクセスするためのOAuth 2.0認可フローの基本的な例を示す図。

アイデンティティ・ドメインを操作する場合は、特定のOAuth 2.0パラメータを使用します。次の表では、最も一般的なパラメータについて説明します。

パラメータ コメント

承認ヘッダー

基本<base64_clientid_secret>

ヘッダー内のアクセス・トークンを転送するために、クライアントがBasic認証スキームとして使用します。アクセス・トークン値は、コロンをセパレータにして連結したクライアントIDとクライアント・シークレットのBase64 UTF-8エンコード値である必要があります(たとえば、clientID:clientSecret)。

クライアントID

<client_id>

必須。アイデンティティ・ドメイン・コンソールでアプリケーションを登録するときに生成される一意のAPIキー。

クライアント・シークレット

<client_secret>

必須。アイデンティティ・ドメイン・コンソールでアプリケーションを登録するときに生成されるパスワードに似た秘密キー。この値は共有しないでください。

アクセス・トークンURL

/oauth2/v1/token

アイデンティティ・ドメインからアクセス・トークンを取得するために使用されるエンドポイント。

認証URL

/oauth2/v1/authorize

アイデンティティ・ドメインから認可コードを取得するために使用するエンドポイントで、3レッグOAuthフローに使用されます。

権限タイプ

client_credentials

必須。これは、呼び出されるREST APIがクライアント・アプリケーションによって所有されることを意味します。

スコープ(必須)

urn:opc:idm:__myscopes__

このスコープはアプリケーションに付与されたすべての付与を返します。必要に応じて、他のスコープを使用して特定の権限を取得できます。

ステップ1: コンソールを使用したアイデンティティ・ドメインへの機密アプリケーションの登録

アイデンティティ・ドメイン・コンソールに機密アプリケーションを登録するとき、OAuth 2.0の操作に必要な主要パラメータであるクライアントID、クライアント・シークレットおよびスコープを取得します。OAuth 2.0は委任認可を実装するための標準であり、認可はリソースへのアクセスに必要なアクセス・トークンに基づきます。アクセス・トークンは特定のスコープに対して発行できます。スコープによって、アクセス・トークンの動作、およびアクセス・トークンがアクセスできるリソースが定義されます。アイデンティティ・ドメインにWebアプリケーションを登録する場合は、スコープを追加します。次の例では、ユーザーの検索、編集、作成および削除をリクエストするのに必要なスコープが追加されます。ただし、監査イベントの管理など、他の作業を実行する場合は他のスコープが必要です。

機密アプリケーションを作成して登録するには、OCIコンソールにアクセスし、次のステップを実行します:

  1. ナビゲーション・メニューを開き、「アイデンティティおよびセキュリティ」を選択します。「アイデンティティ」で、「ドメイン」を選択します。
  2. 作業するアイデンティティ・ドメインの名前をクリックします。必要なドメインを見つけるには、コンパートメントの変更が必要になる場合があります。次に、「統合アプリケーション」をクリックします。
  3. 「アプリケーションの追加」を選択します。
  4. 「アプリケーションの追加」ダイアログ・ボックスで、「機密アプリケーション」を選択し、「ワークフローの起動」を選択します。
  5. 「アプリケーション詳細の追加」ページで、アプリケーション名と説明を入力し、「次へ」を選択します。
  6. 「OAuthの構成」ページの「クライアント構成」で、「このアプリケーションをクライアントとして今すぐの構成します」を選択します。
  7. 「認可」で、「許可される権限付与タイプ」として「クライアント資格証明」のみを選択します。
  8. ページの下部で、「アプリケーション・ロールの追加」を選択し、「ロールの追加」を選択します。
  9. 「アプリケーション・ロールの追加」パネルで、「Identity Domain Administrator」を選択し、「追加」を選択します。
  10. 「次へ」を選択し、「終了」を選択します。
  11. アプリケーションの詳細ページで、「一般情報」まで下にスクロールします。「クライアントID」および「クライアント・シークレット」をコピーし、安全な場所に格納します。
  12. アプリケーションの作成後、「アクティブ化」を選択します。

ステップ2: クライアントIDおよびクライアント・シークレットのBase64でのエンコード

アクセス・トークンのリクエストにクライアントIDとクライアント・シークレットを含める場合は、そのクライアントIDとクライアント・シークレットをエンコードする必要があります。
ノート

base64エンコーディングの前に、クライアントIDとクライアント・シークレットを個別にURLでエンコードします。クライアントIDとクライアント・シークレットに特殊文字が含まれない場合は、最初にURLエンコードする必要はありません。ただし、ベスト・プラクティスとしてこれを行うことをお薦めします。
次の各項では、WindowsおよびMac/Linux環境を使用して、クライアントIDとクライアント・シークレットをBase64でUTF-8形式にエンコードする方法を説明します。

Windows

  1. メモ帳を起動して、クライアントIDとクライアント・シークレットをメモ帳に貼り付けます。

  2. クライアントIDとクライアント・シークレットを同じ行に入力し、両者の間にコロンを挿入します: clientid:clientsecret

    ノート

    clientid:clientsecret属性に空白がないことを確認してください。
  3. ファイルをC:\tempに保存し、ファイルの名前をappCreds.txtとします。

  4. Windows ExplorerでC:\tempを右クリックし、コンテキスト・メニューから「CMD Prompt Here」を選択します。

  5. 次のコマンドを入力してクライアントIDおよびクライアント・シークレットをエンコードします。
    certutil -encode appCreds.txt appbase64Creds.txt
  6. メモ帳でC:\temp\appbase64Creds.txtを開き、内容をコピーしてからファイルを閉じます。
    ノート

    セキュリティ関連の理由から、終わったらappCreds.txtappbase64Creds.txtファイルは削除してください。

MacおよびLinux

  1. 優先ノート・ユーティリティ(Mac Notes、gedit Linux、Viなど)を起動して、クライアントIDとクライアント・シークレットをノート・ユーティリティで貼り付けます。

  2. クライアントIDとクライアント・シークレットを同じ行に入力し、両者の間にコロンを挿入します: clientid:clientsecret

    ノート

    clientid:clientsecretにスペースがないことを確認します。
    文。
  3. clientid:clientsecret行をコピーします。

  4. ターミナルを起動して次のコマンドを入力します。clientid:clientsecretの部分は、クリップボードにコピーした値を置き換えてください。

    echo -n "clientid:clientsecret" | base64 -w 0
    ノート

    Linuxの場合、コマンドに-w 0を追加して改行を削除します。
  5. 返される値をコピーします。
    ノート

    返された値を複数の行に分割した場合は、テキスト・エディタに戻り、結果全体がテキストの折返しがない1行になっていることを確認します。

ステップ3: アクセス・トークンの取得

このプロセスの次のステップでは、アクセス・トークンをリクエストします。

  1. コマンド・プロンプトを起動します。

  2. 次のcURLコマンドを入力します。その際にカッコ( < > )内のテキストは適切な値に置き換えてください。

       curl -i
       -H "Authorization: Basic <base64encoded clientid:secret>"
       -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
       --request POST https://<domainURL>/oauth2/v1/token
       -d "grant_type=client_credentials&scope=urn:opc:idm:__myscopes__"
    ノート

    UNIX OSを使用している場合は、cURLコマンドの末尾に| awk -F"\"" '{print $4}'を追加して、Bearerトークンのみを解析できます。トークンのデフォルトの有効期限は、リクエスト時間から3600秒です。
    ノート

    オプションで、次のcURLコマンドを実行して、環境内のAccessTokenValueというUNIX変数を介してアクセス・トークン値にアクセスできるようにします:
       export AccessTokenValue=`curl -i
       -H "Authorization: Basic <base64encoded clientid:secret>"
       -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
       --request POST https://<domainURL>/oauth2/v1/token
       -d "grant_type=client_credentials&scope=urn:opc:idm:__myscopes__" | awk -F"\"" '{print $4}' |  tail -n +16`
    その後、echo $AccessTokenValueコマンドを実行して、アクセス・トークン値を取得できます。
    カッコ内のテキスト
    base64encodedクライアントID: シークレット Base64「クライアントIDおよびクライアント・シークレットのエンコード」の項で生成されたエンコード済資格証明に置き換えます。clientid:clientsecret資格証明にスペースがないことを確認します。
    IDCS_Service_Instance アイデンティティ・ドメインのURLに置き換えます(たとえば、https://<domainURL>/).)。
    ノート

    コマンド内のurn:opc:idm:__myscopes__スコープは、OAuth認可サーバーからのアクセス・トークンをリクエストするアイデンティティ・ドメイン・クライアントによってタグとして使用されています。リクエスト元のクライアントに付与されたアイデンティティ・ドメイン管理者ロールおよびクライアントのリクエストで指定されたユーザー(存在する場合)によって表される権限に基づいて、適用可能なすべてのアイデンティティ・ドメイン・スコープを含むアクセス・トークンが返されます。このスコープは、アイデンティティ・ドメイン管理者ロールに直接付与されません。
  3. レスポンスのaccess_token値をコピーします。実際のトークン(引用符内にたaccess_token値)のみをコピーするようにします。

    Status: 200
    "access_token":"eyJ4NXQiOiI4Wk. . ."
    "token":"Bearer",
    "expires_in":3600
    
    ノート

    レスポンスにはexpires_in: 3600パラメータが含まれています。これは、トークンの生成から1時間後に、そのトークンが無効になることを意味します。1時間経過すると、トークンをリフレッシュするか、新しいアクセス・トークンを取得する必要があります。次のcURLコマンドを入力します。その際にカッコ( < > )内のテキストは適切な値に置き換えてください。
    curl -i
      -H "Authorization: Basic <base64 encoded client ID and secret>"
      -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"
      --request POST https://<domainURL>/oauth2/v1/token
      -d "grant_type=refresh_token&refresh_token=<token_value>"

ステップ4: 環境へのRESTリクエストの実行

OAuth 2.0アクセス・トークンを取得した後、cURLコマンドでそのトークンを使用して、アイデンティティ・ドメインREST APIにRESTリクエストを送信できます。次のコマンドは、アイデンティティ・ドメイン内のユーザーのリストを返します。

   curl -X GET
   -H "Content-Type:application/scim+json"
   -H "Authorization: Bearer <access_token>"
   https://<domainURL>/admin/v1/Users
項目
方法 -X取得
コンテンツ・タイプ・ヘッダー -H "Content-Type:application/scim-json"
承認ヘッダー -H "認可: Bearer <access_token>"
HTTPプロトコル HTTPまたはHTTPS (HTTPをお薦めします)
アイデンティティ・ドメイン アイデンティティ・ドメインURL (https://<domainURL>).など)
アイデンティティ・ドメインRESTエンドポイント /admin/v1/Users

アイデンティティ・ドメインREST APIからのJSON出力の例

前のステップで、cURLを使用して送信されたRESTリクエストからレスポンスがJSON形式で返されました。JSONは、アプリケーションに必要な特定の属性の取得など、ニーズに応じてフォーマットまたは解析できるオープン規格です。

{
  "schemas": [
    "urn:scim:api:messages:2.0:ListResponse"
  ],
  "totalResults": 1,
  "Resources": [
    {
      "displayName": "admin opc",
      "name": {
        "givenName": "admin",
        "formatted": "admin opc",
        "familyName": "opc"
      },
      "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User": {
        "locked": {
          "on": false
        }
      },
      "userName": "admin@example.com",
      "id": "d252a54d83c344eb8f59f7053a0562ce",
      "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User": {
        "isFederatedUser": false
      },
      "active": true,
      "nickName": "TAS_TENANT_ADMIN_USER",
      "emails": [
        {
          "verified": false,
          "value": "admin@example.com",
          "type": "work",
          "primary": true
        },
        {
          "verified": false,
          "value": "admin@example.com",
          "primary": false,
          "type": "recovery"
        }
      ],
      "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User",
        "urn:ietf:params:scim:schemas:core:2.0:User"
      ],
      "meta": {
        "resourceType": "User",
        "created": "2022-07-22T18:11:08Z",
        "lastModified": "2022-07-25T21:19:28Z",
        "location": "https://<domainURL>admin/v1/Users/d252a54d83c344eb8f59f7053a0562ce"
      },
      "idcsLastModifiedBy": {
        "value": "idcssso",
        "$ref": "https://<domainURL>admin/v1/Apps/idcssso",
        "type": "App",
        "display": "idcssso"
      }
    }
  ],
  "startIndex": 1,
  "itemsPerPage": 50
}