ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
OCI API Gatewayを使用したOCIストリーミングと他の認可メソッドの統合
イントロダクション
Oracle Cloud Infrastructure(OCI)RESTサービスを使用するには、多くの場合、アプリケーションが必要です。コンポーネント間のセキュリティを保証するには、アプリケーションがバックエンド・サービスに対して安全に認証できるように、いくつかの方法があります。
ネットワークを保護し、既存のサービスにアクセスする方法はいくつかあるため、ほとんどの場合、このタスクはOracle Cloud内でネイティブです。ちょっとした設定で、完了です。ただし、アプリケーションが追加のセキュリティおよび接続要件を提供する場合もあります。このチュートリアルのユース・ケースは、ハイブリッドまたはマルチクラウドのシナリオ(Oracle Cloudに接続されたオンプレミス、または別のクラウドに接続されたOracle Cloud)で非常に一般的なニーズを満たしています。
次のシナリオについて説明します。
-
高速接続/VPNを介してOracle Cloudに接続されたオンプレミス・ネットワーク上のアプリケーション。
-
アプリケーションはOCIストリーミング・サービスを利用する必要があります。
-
OCIサービスには、アプリケーション・コンシューマの可能性を満たす認証メカニズムはありません。
-
アプリケーションがサービスに安全にアクセスできるようにするには、OAuth2を使用して認証する必要があります。
したがって、チュートリアルでは次の解決策を提供します。
-
Oracle Identity Cloud Serviceクラウド独自のアイデンティティ・プロバイダを構成して、OAuth2を介して認証します。
-
取得したトークンを介して認証するために、Oracle Identity Cloud Serviceと統合するようにOCI API Gatewayを構成します。
-
OCIストリーミング(
draft-cavage-http-signatures-08
メソッド)の認証を生成するファンクションをコーディングします。 -
グループとポリシーを作成して、クラウド・リソースへのアクセスを制限します。
-
クライアントIDおよびシークレットIDを渡して認証トークンを取得できるアイデンティティ・プロバイダを提供します。
-
取得したトークンを介して認証し、コンシューマがOCIストリーミング・サービスを使用できるようにする、機能的なAPIゲートウェイRESTサービスを提供します。
ノート: OCI Functionsコードは、OAuthOCIService-fn.zipからダウンロードできます。
目的
-
外部アプリケーションがOAuth2認証でOCI RESTサービスを消費できるようにします。
-
OCIでOAuth2認証サービスを提供します。
-
OCI API GatewayおよびOCI Functionsを構成して、トークンを介してOCIサービスを実行します。
前提条件
-
インターネットに作成および公開されるOCI API Gatewayインスタンス。詳細は、Oracle Cloudでの最初のAPIゲートウェイの作成を参照してください。
-
OCI APIゲートウェイ、OCI FunctionsおよびOCI PaaSリソース間のネットワーク接続。
-
VCN/サブネット
-
セキュリティ・リスト
-
NAT Gateway/インターネット・ゲートウェイ
-
パブリック/プライベート・ネットワーク
-
-
OCIサービスのコールをコーディングするためのOCI FunctionsおよびOCI REST APIの知識。
タスク1: Oracle Identity Cloud Serviceを使用したOAuth2の構成
-
OCI APIゲートウェイ・パラメータの取得: OAuth2メカニズムの構成を開始します。Oracle CloudからOracle Identity Cloud Serviceをアイデンティティ・プロバイダとして構成することで、OCI API Gatewayインスタンスをアイデンティティ・プロバイダに統合する必要があります。
-
OCI APIゲートウェイ・インスタンスに移動し、ホスト名をコピーします。この情報は、次のステップでOracle Identity Cloud Serviceリソース・サーバー構成で使用されます。
-
-
リソース・アプリケーションの作成: アプリケーションのOAuth2認可プロバイダを作成する必要があります。Oracle CloudのOracle Identity Cloud Serviceでこれを実行できます。
-
OCIコンソールで、「アイデンティティとセキュリティ」に移動し、「フェデレーション」を選択します。
-
OracleIdentityCloudSeviceをクリックします。
-
Oracle Identity Cloud ServiceインスタンスのOracle Identity Cloud Serviceコンソール・リンクをクリックします。
-
2つのアプリケーションを作成します。「アプリケーションおよびサービス」をクリックします。
-
「アプリケーション」で「追加」をクリックします。
-
リソース・サーバーの構成を開始するには、「機密アプリケーション」を選択します。
-
最初のアプリケーションを構成します。リソース・サーバー・アプリケーションに「名前」を入力し、「次へ」をクリックします。
-
「後にスキップ」をクリックします。リソースのみを構成する必要があります。
-
ステップ1で取得したAPIゲートウェイ・ホスト名を入力します。
-
「スコープの追加」をクリックし、スコープ情報を入力します。
-
スコープ情報を確認し、「次へ」を2回クリックし、「終了」をクリックします。
-
「アクティブ化」をクリックして、アプリケーションをアクティブ化します。
-
-
クライアント・アプリケーションの作成
-
「アプリケーション」で「追加」をクリックします。
-
リソース・サーバーの構成を開始するには、「機密アプリケーション」を選択します。
-
アプリケーションの「名前」を入力し、「次へ」をクリックします。
-
クライアント・アプリケーションの構成を有効にするには、「アプリケーションをクライアントとして今すぐ構成します」を選択します。「クライアント資格証明」、「JWTアサーション」および「代理」を選択します。
ノート: 関数コードでOAuth2を検証する場合は、Introspectフラグを設定する必要があります。これにより、
/oauth2/v1/introspect
Oracle Identity Cloud Service REST APIサービスが有効になります。 -
スクロール・ダウンして「スコープの追加」をクリックします。
-
(
oauth_resource_server
)の前に作成したリソース・アプリケーションを検索し、「追加」をクリックします。 -
アプリケーションに追加されたスコープを確認できます。「次」をクリックします。
ノート: スコープ値に注意してください。これを使用してトークンをリクエストする必要があります。
-
「リソース」および「Web層ポリシー」ウィンドウをスキップします。「認可」で、「認可としての付与の強制」を選択し、「終了」をクリックします。
-
「Client ID」および「Client Secret」の情報を確認します。トークンを取得するにはこれが必要になります。
-
「アクティブ化」をクリックしてアプリケーションをアクティブ化し、OAuth2認可プロバイダをテストする準備ができました。
-
-
トークンの取得: これで、OAuth2認可プロバイダをテストしてトークンを取得できます。
-
認可プロバイダのURLを作成します。これを取得するには、ブラウザでOracle Identity Cloud ServiceのURLを取得します。Oracle Identity Cloud ServiceのURLには、
https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole
のようなものが表示されます。 -
URLリンクは、ルート・エンドポイントである
oraclecloud.com
まで必要です。例:https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com
。 -
oAuth認証パスを追加する必要があります。このURLは、
POST
RESTリクエストとして実行されます。たとえば、https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/token
です。トークンをリクエストするには、いくつかのパラメータを入力する必要があります。 -
資格証明には、「Basic Authentication」、「Client ID」および「Client Secret」と入力します。
-
「本文」コンテンツに、grant_typeおよびscopeの値を入力します。スコープはOracle Identity Cloud Service構成で取得されたことに注意してください。
-
「送信」をクリックし、
POST
リクエストを実行してトークンを表示します。
-
タスク2: OCI SDK APIをコールするためのOCI関数の構成
-
OCIファンクションおよびOCI APIゲートウェイの理解: OCI APIゲートウェイを介してサービスを公開することがベスト・プラクティスです。認証は、OCI API Gatewayからバックエンド・サービスに資格証明をバイパスして行うことができますが、バックエンド認証がクライアント・アプリケーションに適した方法ではない場合、OCI API Gatewayレベルで構成できます。
このステップでは、OCI API Gatewayが、OCI Functionsを介したOCIストリーミングなど、OAuth2認証と任意のOCIサービスのリクエストを統合するのにどのように役立つかを理解しましょう。
OCI Functionsは、ユーザー資格証明または秘密キーをコンシューマ・アプリケーションに渡す必要なく、正しい認証/認可を生成し、OCIサービスに渡すジョブを実行できます。OCIサービスの一部のサービスは、OAuth2メソッドを使用して認証できないため、OCI Functionsを使用して認証できます。OCI Functionsを作成およびデプロイするには、OCI Functionsクイックスタートを参照してください。
この例では、OCIストリーミング・サービスはdraft-cavage-http-signatures-08メソッドを介してOCI IAMのOCI秘密キーによって認証でき、コンシューマはOAuth2によって認証できます。
-
コードの理解: このコードはOCI API Gatewayで使用されます。APIデプロイメントでは、OCI APIゲートウェイでOCIストリーミング・エンドポイントを構成し、HEADER認可パラメータとして渡されます。そのため、このファンクションは、必要な各OCI API Gatewayデプロイメントの多くのサービスに使用できます。
-
Pythonのこの関数は、認証用の日付と時刻をフォーマットして作成します。この日時は一度生成し、2つのポイントで使用する必要があります。OCIストリーミング・リクエストのヘッダー「日付」および「署名」暗号化ヘッダー。
-
これは署名暗号化の機能です。アセンブリは、OCI IAMユーザーの秘密キーをSHA-256で使用し、次にbase64で使用することで構成されます。
-
署名暗号化は、完全な認可ヘッダーで使用されます。
-
これは、Oracle Identity Cloud Service OAUTH2トークン検証コードです。Oracle Identity Cloud Serviceアプリケーション・パラメータを使用して
config.json
ファイルを構成する必要があります。 -
これはファンクションの開始部分であり、このAPIデプロイメント用に作成されたOCI IAMセキュリティおよびOCIストリーミング変数(
streaming_host
およびoci_region
)から一部の情報を初期化します。 -
これはこの機能の主要部分であり、2つの部分があります。
最初の部分では、APIゲートウェイ・リクエストで渡されたトークンを取得します。その後、auth_idcs()関数をコールして、Oracle Identity Cloud Serviceのトークンを検証します。draft-cavage-http-signatures-08文字列を生成する前に、Oracle Identity Cloud Serviceトークンを検証します。有効なトークンでない場合、応答は 401 unauthorizedエラーを返します。
2つ目の部分では、2つの値を作成します。日付(d)と日付書式は、署名(a)の作成に使用されます。rdataは、OCI API GatewayがOCIストリーミングで認証するために使用するauthorizationおよびdate値を使用してファンクションのレスポンスを構築します。
-
ここでは、OCI可観測性でログを生成でき、このステップはオプションです。ログのOracle Cloud Identifier (OCID)を入力します。以前にカスタム・ログを作成する必要があります。
ノート: OCI可観測性でカスタム・ログを作成するには、OCI APIゲートウェイ、ファンクションおよび可観測性を使用したJSONコンテンツの検証およびAPIヘッダーおよび本体のモニターを参照してください。
-
これは最後のステップであり、有効な認証で戻されます。
これは、この関数(fn)にロードする必要がある
requirements.txt
ライブラリです。requirements.txt --------------------- fdk>=0.1.54 requests oci cryptography six PyJWT py3_lru_cache simplejson
これは
config.json
ファイルです。これがOCI構成ファイルです。このファイルはOCI CLIインストールからコピーできますが、
key_file
セクションを変更し、OCI CLIインストールのパスを削除することが重要です。これは、Pythonコードでdraft-cavage-http-signatures-08
暗号化文字列を生成するために使用されます。ファンクションをデプロイする前に、2つの変数を作成し、次のようなOCIストリーミングOCIDおよびOCIリージョンの値を入力します。
fn config app <function-app> streaming_host ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqhgw275qp7a fn config app <function-app> oci_region us-ashburn-1
ファンクションをデプロイし、OCI API Gatewayで構成します。
-
タスク3: APIゲートウェイ・デプロイメントの構成
ノート: ファンクションを開発し、OCI API Gatewayでコールします。OCI Functions: APIゲートウェイを使用したAPIキーの検証を参照してください。
-
OCI API Gatewayサービスを構成します。この例では、OCIストリーミング・サービスを構成します。基本情報で、「パス接頭辞」に
/20180418/streams/
とストリーミング・インスタンスのOCIDを入力します。たとえば:
/20180418/streams/ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
「認証」で、「単一認証」および「認可プロバイダ・ファンクション」を選択します。コンパートメントを選択し、Oracle Functionを
get-authorization
として選択します。 -
リクエストHEADERのパラメータを構成します。
Header Parameter 1 Context table=request.headers Header name=Date Argument name=Date Header Parameter 2 Context table=request.headers Header name=token Argument name=token
-
Oracle Identity Cloud Serviceパラメータに対してHEADERを構成するには、「ルート・リクエスト・ポリシーの表示」をクリックする必要があります。
-
HEADER変換で、「編集」をクリックし、両方のパラメータで「動作」に
Overwrite
と入力し、「ヘッダー名」にAuthorization
、Date
および「値」にそれぞれ${request.auth[authorization]}
および${request.auth[date]}
と入力します。${request.auth[authorization]}
および${request.auth[date]}
は、ファンクションPythonコードによって返される値であり、バックエンド・サービスのHEADERとして渡されます。
タスク4: OCIグループおよびポリシーの構成
OCIストリーミングのポリシーを構成するには、OCIストリーミング・ポリシーを参照し、共通ポリシーを使用できます。共通ポリシーを参照してください。
タスク5: APIのテスト
OCIストリーミングのモデル・デプロイメント・サービスに対するアプリケーションOAuth2リクエストをシミュレートします。
-
トークンを取得し、クライアントIDおよびクライアント・シークレットをOracle Identity Cloud Serviceプロバイダに渡します。
Verb: POST URL: https://idcs-xxxxxxxxxxxxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/token BODY (x-www-form-urlencoded): scope: xxxxxxxxxxxxxxxxxxx.apigateway.us-ashburn-1.oci.customer-oci.com/super-scope grant_type: client_credentials HEADER Authorization: clientID:clientSecret\* - convert your clientID:clientSecret to a base64 value
-
OCI APIゲートウェイへのリクエストをテストします。APIゲートウェイ・デプロイメント・エンドポイントを入力し、RESTリクエストに対して「POST」を選択します。要求の本体で6つのヘッダーを宣言する必要があります。
Content-Type: application/json access-control-allow-origin: * access-control-allow-method: POST,PUT,GET,HEAD,DELETE,OPTIONS access-control-allow-credentials: true Date: put an actual date in this format -> Thu, 21 Dec 2023 13:53:59 GMT token: put your <access_token> here* * Remember that your token have 1 hour duration.
次に結果を示します。
「ログ」には、カスタム・コード認可ロジックのペイロードが表示されます。
関連リンク
承認
- 著者 - Cristiano Hoshikawa (Oracle LAD Aチーム・ソリューション・エンジニア)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Integrate OCI Streaming with Other Authorization Methods Using OCI API Gateway
F91392-02
November 2024