OAuth 2を使用したREST APIへのアクセス
アイデンティティ・ドメインREST APIでは、標準SCIM 2.0コア・スキーマおよびOracleスキーマ拡張を使用するSCIM 2.0準拠のエンドポイントをサポートして、ユーザー、グループ、アプリケーションおよびアイデンティティ機能(パスワード管理、管理タスクなど)をプログラムを使用して管理します。アイデンティティ・ドメインへのREST APIコールを行うには、認可に使用するOAuth2アクセス・トークンが必要です。アクセス・トークンは、クライアント・アプリケーションがアイデンティティ・ドメインでタスクを実行するために使用するセッション(スコープおよび期限切れ)を提供します。
次のシーケンス図は、アイデンティティ・ドメイン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コンソールにアクセスし、次のステップを実行します:
- ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ドメイン」をクリックします。
- 作業するアイデンティティ・ドメインの名前をクリックします。必要なドメインを見つけるには、コンパートメントの変更が必要になる場合があります。次に、「統合アプリケーション」をクリックします。
- 「アプリケーションの追加」をクリックします。
- 「アプリケーションの追加」ダイアログ・ボックスで、「機密アプリケーション」を選択し、「ワークフローの起動」をクリックします。
- 「アプリケーション詳細の追加」ページで、アプリケーションの名前および説明を入力し、「次」をクリックします。
- 「OAuthの構成」ページの「クライアント構成」で、「今すぐこのアプリケーションをクライアントとして構成します」を選択します。
- 「Authorization」で、「Allowed Grant Type」として「Client Credentials」のみを選択します。
- ページの下部で、「アプリケーション・ロールの追加」、「ロールの追加」の順に選択します。
- 「アプリケーション・ロールの追加」パネルで「Identity Domain Administrator」を選択し、「追加」をクリックします。
- 「次」をクリックし、「終了」をクリックします。
- アプリケーションの詳細ページで、「一般情報」まで下にスクロールします。「クライアントID」および「クライアント・シークレット」をコピーし、安全な場所に格納します。
- アプリケーションが作成された後、「アクティブ化」をクリックします。
ステップ2: Base64クライアントIDおよびクライアント・シークレットのエンコード
base64エンコーディングの前に、URLによってクライアントIDとクライアント・シークレットが個別にエンコードされます。クライアントIDとクライアント・シークレットに特殊文字が含まれない場合は、最初にURLエンコードする必要はありません。ただし、ベスト・プラクティスとしてこれを行うことをお薦めします。
Windows
-
ノートパッドを起動して、クライアントIDとクライアント・シークレットをノートパッドに貼り付けます。
-
クライアントIDとクライアント・シークレットを同じ行に入力し、両者の間にコロンを挿入します:
clientid:clientsecret
ノート
空白がclientid:clientsecret属性でないことを確認してください。 -
ファイルを
C:\temp
に保存し、ファイルにappCreds.txt.
という名前を付けます。 -
Windows Explorerで
C:\temp
を右クリックし、コンテキスト・メニューから「CMD Prompt Here」を選択します。 -
クライアントIDおよびクライアント・シークレットをエンコードするには、次のコマンドを入力します。
certutil -encode appCreds.txt appbase64Creds.txt
-
メモ帳で
C:\temp\appbase64Creds.txt
を開き、内容をコピーしてからファイルを閉じます。ノート
セキュリティ上の理由から、appCreds.txt
およびappbase64Creds.txt
ファイルは終了後に削除してください。
MacおよびLinux
-
任意のノート・ユーティリティ(Mac Notes、Gedit Linux、Viなど)を起動して、クライアントIDとクライアント・シークレットをノート・ユーティリティに貼り付けます。
クライアントIDとクライアント・シークレットを同じ行に入力し、両者の間にコロンを挿入します:
clientid:clientsecret.
ノート文。
clientid:clientsecretに空白が含まれないようにしてください。-
clientid:clientsecret
行をコピーします。 -
ターミナルを起動して次のコマンドを入力します。
clientid:clientsecret
はクリップボードにコピーした値に置き換えてください。echo -n "clientid:clientsecret" | base64 -w 0
ノート
Linuxの場合、コマンドに-w 0
を追加して改行を削除します。 -
返された値をコピーします。ノート
返された値が複数の行に分割されている場合は、テキスト・エディタに戻り、結果全体がテキストの折返しがない1行になっていることを確認してください。
ステップ3: アクセス・トークンの取得
このプロセスの次のステップでは、アクセス・トークンをリクエストします。
-
コマンド・プロンプトを起動します。
-
次の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}'
を追加して、ベアラー・トークンのみを解析できます。トークンのデフォルトの有効期限は、リクエスト時間から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 clientid: シークレット Base64クライアントIDおよびクライアント・シークレットのエンコードの項で生成したエンコード済資格証明に置き換えます。clientid:clientsecret資格証明に空白が含まれていないことを確認します。 IDCS_Service_Instance アイデンティティ・ドメインURL (たとえば、 https://<domainURL>/).
)に置き換えますノート
コマンドのurn:opc:idm:__myscopes__
スコープは、アイデンティティ・ドメイン・クライアントにより、OAuth認可サーバーからのアクセス・トークンをリクエストするタグとして使用されます。リクエスト側クライアントおよびクライアントのリクエストで指定されるユーザー(ある場合)に付与されたアイデンティティ・ドメイン管理者ロールによって表される権限に基づいて、適用可能なすべてのアイデンティティ・ドメイン・スコープを含むアクセス・トークンが返されます。このスコープは、どのアイデンティティ・ドメイン管理者ロールにも直接は付与されません。 -
レスポンスの
access_token
値をコピーします。実際のトークン(引用符に囲まれたaccess_token
値)のみをコピーするようにしてください。Status: 200 "access_token":"eyJ4NXQiOiI4Wk. . ." "token":"Bearer", "expires_in":3600
ノート
レスポンスにはexpires_in: 3600
パラメータが含まれています。これは、トークンを生成した時間から1時間後に、トークンが無効になることを意味します。1時間経過すると、トークンをリフレッシュするか、新しいアクセス・トークンを取得する必要があります。
ステップ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
}