ノート:

OCI API Gatewayを使用したOCIストリーミングと他の認可メソッドの統合

イントロダクション

Oracle Cloud Infrastructure(OCI)RESTサービスを使用するには、多くの場合、アプリケーションが必要です。コンポーネント間のセキュリティを保証するには、アプリケーションがバックエンド・サービスに対して安全に認証できるように、いくつかの方法があります。

ネットワークを保護し、既存のサービスにアクセスする方法はいくつかあるため、ほとんどの場合、このタスクはOracle Cloud内でネイティブです。ちょっとした設定で、完了です。ただし、アプリケーションが追加のセキュリティおよび接続要件を提供する場合もあります。このチュートリアルのユース・ケースは、ハイブリッドまたはマルチクラウドのシナリオ(Oracle Cloudに接続されたオンプレミス、または別のクラウドに接続されたOracle Cloud)で非常に一般的なニーズを満たしています。

次のシナリオについて説明します。

したがって、チュートリアルでは次の解決策を提供します。

ノート: OCI Functionsコードは、OAuthOCIService-fn.zipからダウンロードできます。

目的

前提条件

タスク1: Oracle Identity Cloud Serviceを使用したOAuth2の構成

  1. OCI APIゲートウェイ・パラメータの取得: OAuth2メカニズムの構成を開始します。Oracle CloudからOracle Identity Cloud Serviceをアイデンティティ・プロバイダとして構成することで、OCI API Gatewayインスタンスをアイデンティティ・プロバイダに統合する必要があります。

    • OCI APIゲートウェイ・インスタンスに移動し、ホスト名をコピーします。この情報は、次のステップでOracle Identity Cloud Serviceリソース・サーバー構成で使用されます。

      img.png

  2. リソース・アプリケーションの作成: アプリケーションのOAuth2認可プロバイダを作成する必要があります。Oracle CloudのOracle Identity Cloud Serviceでこれを実行できます。

    1. OCIコンソールで、「アイデンティティとセキュリティ」に移動し、「フェデレーション」を選択します。

      img.png

    2. OracleIdentityCloudSeviceをクリックします。

      img.png

    3. Oracle Identity Cloud ServiceインスタンスのOracle Identity Cloud Serviceコンソール・リンクをクリックします。

      img.png

    4. 2つのアプリケーションを作成します。「アプリケーションおよびサービス」をクリックします。

      img.png

    5. 「アプリケーション」で「追加」をクリックします。

      img.png

    6. リソース・サーバーの構成を開始するには、「機密アプリケーション」を選択します。

      img.png

    7. 最初のアプリケーションを構成します。リソース・サーバー・アプリケーションに「名前」を入力し、「次へ」をクリックします。

      img.png

    8. 「後にスキップ」をクリックします。リソースのみを構成する必要があります。

      img.png

    9. ステップ1で取得したAPIゲートウェイ・ホスト名を入力します。

      img.png

    10. 「スコープの追加」をクリックし、スコープ情報を入力します。

      img.png

    11. スコープ情報を確認し、「次へ」を2回クリックし、「終了」をクリックします。

      img.png

    12. 「アクティブ化」をクリックして、アプリケーションをアクティブ化します。

      img.png

  3. クライアント・アプリケーションの作成

    1. 「アプリケーション」で「追加」をクリックします。

      img.png

    2. リソース・サーバーの構成を開始するには、「機密アプリケーション」を選択します。

      img.png

    3. アプリケーションの「名前」を入力し、「次へ」をクリックします。

      img_1.png

    4. クライアント・アプリケーションの構成を有効にするには、「アプリケーションをクライアントとして今すぐ構成します」を選択します。「クライアント資格証明」「JWTアサーション」および「代理」を選択します。

      img.png

      ノート: 関数コードでOAuth2を検証する場合は、Introspectフラグを設定する必要があります。これにより、/oauth2/v1/introspect Oracle Identity Cloud Service REST APIサービスが有効になります。

      img_10.png

    5. スクロール・ダウンして「スコープの追加」をクリックします。

      img.png

    6. (oauth_resource_server)の前に作成したリソース・アプリケーションを検索し、「追加」をクリックします。

      img.png

    7. アプリケーションに追加されたスコープを確認できます。「次」をクリックします。

      img.png

      ノート: スコープ値に注意してください。これを使用してトークンをリクエストする必要があります。

    8. 「リソース」および「Web層ポリシー」ウィンドウをスキップします。「認可」で、「認可としての付与の強制」を選択し、「終了」をクリックします。

      img.png

    9. 「Client ID」および「Client Secret」の情報を確認します。トークンを取得するにはこれが必要になります。

      img.png

    10. 「アクティブ化」をクリックしてアプリケーションをアクティブ化し、OAuth2認可プロバイダをテストする準備ができました。

      img_1.png

  4. トークンの取得: これで、OAuth2認可プロバイダをテストしてトークンを取得できます。

    1. 認可プロバイダのURLを作成します。これを取得するには、ブラウザでOracle Identity Cloud ServiceのURLを取得します。Oracle Identity Cloud ServiceのURLには、https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsoleのようなものが表示されます。

    2. URLリンクは、ルート・エンドポイントであるoraclecloud.comまで必要です。例: https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com

    3. oAuth認証パスを追加する必要があります。このURLは、POST RESTリクエストとして実行されます。たとえば、https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/tokenです。トークンをリクエストするには、いくつかのパラメータを入力する必要があります。

    4. 資格証明には、「Basic Authentication」「Client ID」および「Client Secret」と入力します。

      img.png

    5. 「本文」コンテンツに、grant_typeおよびscopeの値を入力します。スコープはOracle Identity Cloud Service構成で取得されたことに注意してください。

      img.png

    6. 「送信」をクリックし、POSTリクエストを実行してトークンを表示します。

      img_2.png

タスク2: OCI SDK APIをコールするためのOCI関数の構成

  1. 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によって認証できます。

  2. コードの理解: このコードはOCI API Gatewayで使用されます。APIデプロイメントでは、OCI APIゲートウェイでOCIストリーミング・エンドポイントを構成し、HEADER認可パラメータとして渡されます。そのため、このファンクションは、必要な各OCI API Gatewayデプロイメントの多くのサービスに使用できます。

    img_12.png

    • Pythonのこの関数は、認証用の日付と時刻をフォーマットして作成します。この日時は一度生成し、2つのポイントで使用する必要があります。OCIストリーミング・リクエストのヘッダー「日付」および「署名」暗号化ヘッダー。

      img_1.png

    • これは署名暗号化の機能です。アセンブリは、OCI IAMユーザーの秘密キーをSHA-256で使用し、次にbase64で使用することで構成されます。

      img_2.png

    • 署名暗号化は、完全な認可ヘッダーで使用されます。

      img_3.png

    • これは、Oracle Identity Cloud Service OAUTH2トークン検証コードです。Oracle Identity Cloud Serviceアプリケーション・パラメータを使用してconfig.jsonファイルを構成する必要があります。

      img_13.png

    • これはファンクションの開始部分であり、このAPIデプロイメント用に作成されたOCI IAMセキュリティおよびOCIストリーミング変数(streaming_hostおよびoci_region)から一部の情報を初期化します。

      img_4.png

    • これはこの機能の主要部分であり、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値を使用してファンクションのレスポンスを構築します。

      img_15.png

    • ここでは、OCI可観測性でログを生成でき、このステップはオプションです。ログのOracle Cloud Identifier (OCID)を入力します。以前にカスタム・ログを作成する必要があります。

      ノート: OCI可観測性でカスタム・ログを作成するには、OCI APIゲートウェイ、ファンクションおよび可観測性を使用したJSONコンテンツの検証およびAPIヘッダーおよび本体のモニターを参照してください。

      img_6.png

    • これは最後のステップであり、有効な認証で戻されます。

      img_7.png

    これは、この関数(fn)にロードする必要があるrequirements.txtライブラリです。

    requirements.txt
    ---------------------
    fdk>=0.1.54
    requests
    oci
    cryptography
    six
    PyJWT
    py3_lru_cache
    simplejson
    

    これはconfig.jsonファイルです。

    img_14.png

    これがOCI構成ファイルです。このファイルはOCI CLIインストールからコピーできますが、key_fileセクションを変更し、OCI CLIインストールのパスを削除することが重要です。これは、Pythonコードでdraft-cavage-http-signatures-08暗号化文字列を生成するために使用されます。

    img_16.png

    ファンクションをデプロイする前に、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キーの検証を参照してください。

  1. OCI API Gatewayサービスを構成します。この例では、OCIストリーミング・サービスを構成します。基本情報で、「パス接頭辞」/20180418/streams/とストリーミング・インスタンスのOCIDを入力します。

    たとえば: /20180418/streams/ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxx

    img.png

  2. 「認証」で、「単一認証」および「認可プロバイダ・ファンクション」を選択します。コンパートメントを選択し、Oracle Functionget-authorizationとして選択します。

    img.png

  3. リクエスト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
    
  4. Oracle Identity Cloud Serviceパラメータに対してHEADERを構成するには、「ルート・リクエスト・ポリシーの表示」をクリックする必要があります。

    img.png

  5. HEADER変換で、「編集」をクリックし、両方のパラメータで「動作」Overwriteと入力し、「ヘッダー名」AuthorizationDateおよび「値」にそれぞれ${request.auth[authorization]}および${request.auth[date]}と入力します。${request.auth[authorization]}および${request.auth[date]}は、ファンクションPythonコードによって返される値であり、バックエンド・サービスのHEADERとして渡されます。

    img.png

タスク4: OCIグループおよびポリシーの構成

OCIストリーミングのポリシーを構成するには、OCIストリーミング・ポリシーを参照し、共通ポリシーを使用できます。共通ポリシーを参照してください。

タスク5: APIのテスト

OCIストリーミングのモデル・デプロイメント・サービスに対するアプリケーションOAuth2リクエストをシミュレートします。

  1. トークンを取得し、クライアント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
    

    img_2.png

  2. 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.
    

    img_9.png

    次に結果を示します。

    img_11.png

    「ログ」には、カスタム・コード認可ロジックのペイロードが表示されます。

    img_8.png

承認

その他の学習リソース

docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。