ノート:

OCI API GatewayとOCI Functionsを使用したAPIセキュリティのカスタマイズ

イントロダクション

Oracle Cloud Infrastructure (OCI) FunctionsとOCI API Gatewayの間のシームレスな相乗効果を発見し、API用のカスタム認証メソッドを実装し、ファンクションがAPIゲートウェイから引数を取得する方法をご覧ください。

OCI APIゲートウェイ

OCI APIゲートウェイ・サービスでは、ネットワーク内からアクセス可能なプライベート・エンドポイントとともに、インターネット・トラフィックを受け入れる場合にパブリックIPアドレスで公開できるAPIを公開できます。エンドポイントは、API検証、リクエストとレスポンスの変換、CORS、認証と認可およびリクエスト制限をサポートします。

OCI APIゲートウェイ・サービスを使用して、APIクライアントからのトラフィックを処理し、バックエンド・サービスにルーティングするために、リージョン・サブネットに1つ以上のAPIゲートウェイを作成します。単一のAPIゲートウェイを使用して、複数のバックエンド・サービス(OCIロード・バランサ、OCIコンピュート・インスタンス、OCI Functionsなど)を単一の統合APIエンドポイントにリンクできます。

OCI関数

OCI Functionsは、完全に管理された、マルチテナントでスケーラビリティが高いオンデマンドのFunctions-as-a-Serviceプラットフォームです。エンタープライズグレードのOCI上に構築されており、Fn Projectオープン・ソース・エンジンによって強化されています。OCI Functionsは、ビジネス・ニーズを満たすためのコードの作成に集中したい場合に使用します。

ノート:

目標

前提条件

タスク1: 動的グループの設定

OCIコンソールにログインし、ドメインに移動し、「動的グループ」をクリックして、次の情報を含むグループを作成します。

タスク2: ポリシーの作成

OCIコンソールに移動し、「ポリシー」に移動して、次の情報を含むポリシーを作成します。

タスク3: OCIコンテナ・レジストリの作成

  1. OCIコンソールに移動し、「開発者サービス」「コンテナおよびアーティファクト」に移動し、「コンテナ・レジストリ」を選択して「リポジトリの作成」をクリックし、ファンクション・イメージのプライベート・リポジトリを作成します。

    • リポジトリ名: functions/authorizationfunctionjavaと入力します。

      リポジトリ作成

  2. リポジトリを確認し、ネームスペースをノートにとります。

    リポジトリ・ネームスペース

  3. OCI CLIおよびDockerがインストールされているOCI Cloud Shellを開き、レジストリでログインを続行します。リージョンの正しいURLを確認します。このチュートリアルでは、レジストリURLがgru.ocir.ioであるブラジル東部(サンパウロ)を使用しています。

    docker login -u 'yourRepositoryNamespace/oracleidentitycloudservice/yourUserLogin' gru.ocir.io
    Password: YOUR_AUTH_TOKEN_CREATED_EARLIER
    

    dockerログイン

タスク4: 認可プロバイダ・ファンクションとしてのJava OCIファンクションの作成

ノート:プライベート・サブネットを選択してください。

  1. OCIコンソールに移動し、「開発者サービス」「ファンクション」「アプリケーション」に移動して、「アプリケーションの作成」をクリックします。

    アプリケーションの作成

  2. Docker、OCI CLIおよびFn Project CLIがインストールされているOCI Cloud Shellを起動し、次のコマンドを実行してファンクションを初期化します。

    ノート:タスクに従った場合、Dockerログイン・コマンドがすでに実行されていなければ、タスク3のDockerログイン・ステップに進みます。

    OCIコンソールに移動し、「開発者サービス」「ファンクション」「アプリケーション」に移動し、アプリケーションを選択して「スタート・ガイド」をクリックします。次のコマンドを実行します。

    fn list context
    fn use context sa-saopaulo-1
    fn update context oracle.compartment-id PASTE_YOUR_COMPARTMENT_OCID
    fn update context registry gru.ocir.io/PASTE_YOUR_REGISTRY_NAMESPACE/functions
    

    ノート:このチュートリアルでは、ブラジル東部(サンパウロ)リージョンを使用しています。別のリージョンを使用している場合は、レジストリの場所を変更する必要があります。

  3. authorizationfunctionjava.tarからJava関数のサンプル・コードをダウンロードし、OCI Cloud Shellにアップロードしてから、ファイルの解凍に進みます。

    # check your file is there
    ls -lrt
    # create your directory
    mkdir authorizationfunctionjava
    # unzip the file
    tar -xvf authorizationfunctionjava.tar -C authorizationfunctionjava
    cd authorizationfunctionjava/
    

    tarファイルを解凍

    この単純なJavaコードは、tokencustomerの2つのパラメータを受け取ります。また、関数構成で定義されたシステム環境変数から3番目のパラメータも取得します。

    ノート: handleRequest(入力)メソッドのパラメータ名が、APIゲートウェイ構成で使用される名前と同じであることを確認してください。これにより、APIゲートウェイは認可プロバイダ・ファンクションにパラメータを正しく渡します。

    javaコード

    このコード・スニペットは、入力を検証し、特定のレスポンスを返します。

    validation

    結果

    必要なレスポンス・フォーマットおよびパラメータの詳細は、認可プロバイダ・ファンクションの作成を参照してください。

  4. 次のコマンドを実行してコードを作成し、ファンクションをデプロイします。

    cd authorizationfunctionjava/
    ls -lart
    fn deploy --app chafikFunctions
    

    ビルド

    ビルド

  5. ファンクション検証をテストするための顧客資格証明を格納する構成をいくつか作成します。

    ノート:これらの構成変数は、このチュートリアルで提供されるJavaサンプル・コード内のシステム環境変数として使用されます。ただし、Fn RuntimeContextなどの代替アプローチを使用するようにファンクション・コードを変更できます。詳細は、「ファンクションでのFn RuntimeContextの使用」を参照してください。

    秘密名/キー Value
    FN_AAA_KEY 123456
    FN_BBB_KEY 898989
    FN_ORACLE_KEY ABCD1234
  6. これらの設定は、「開発者サービス」に移動してOCIコンソールで構成できます。「ファンクション」で、「アプリケーション」をクリックし、アプリケーションを選択してからファンクションを選択します。ファンクションの詳細ページで、「構成」をクリックします。

    構成

    または

    fnコマンドを実行します。

    fn config function --help
    
    MANAGEMENT COMMAND
    fn config function - Store a configuration key for this function
    
    USAGE
    fn [global options] config function <app-name> <function-name> <key> <value>
    
    DESCRIPTION
    This command sets the configuration of a specific function for an application.
    
    fn config function chafikFunctions authorizationfunctionjava FN_ORACLE_KEY ABCD1234
    
  7. 次のコマンドを使用してファンクションを呼び出します。

    # Invoke the function to check if it's working as expected
    echo -n '{"data" : {"customer":"ORACLE", "token": "ABCD1234"}}' | fn invoke chafikFunctions authorizationfunctionjava
    

    ノート:ファンクションのウォームアップには、最初の呼出しに最大1分かかる場合があります。構成で追加の設定を確認します。詳細は、プロビジョニングされた同時実行性を使用した初期レイテンシの削減を参照してください。

    有効データと無効データの両方を使用してテストし、ファンクション・レスポンスを検証します。

    ファンクションの呼出し

タスク5: 認可プロバイダ・ファンクションを使用するためのOCI APIゲートウェイおよびモックAPIの作成

ノート:パブリック・サブネットを選択してください。

  1. OCIコンソールに移動し、「開発者サービス」「API管理」「ゲートウェイ」に移動して、「ゲートウェイの作成」をクリックします。

    アプリケーションの作成

  2. 「ゲートウェイの詳細」ページに移動し、「ホスト名」をノートにとります。

    ゲートウェイホスト名

  3. APIゲートウェイでデプロイメントを作成します。「基本情報」に、次の情報を入力します。

    • パス接頭辞: /authFunctionと入力します。

    ノート: APIゲートウェイからのホスト名およびパス接頭辞は、APIエンドポイントを形成するために使用されます。

    基本情報

  4. 「認証」に、次の情報を入力します。

    • 「単一認証」を選択します。

    • 「認可プロバイダ・ファンクション」を選択します。

    • Oracle Functionsアプリケーション:タスク4で作成したアプリケーションを選択します。

    • Oracle Function:タスク4で作成した関数を選択します。

    • 「複数引数認可プロバイダ・ファンクション」を選択します。

    • 関数の引数:次の情報を入力します。

      コンテキスト表 ヘッダー名 引数名
      request.headers 顧客 顧客
      request.headers トークン トークン

    ノート ヘッダー名は、APIエンドポイントの起動時にリクエスト・ヘッダーに含まれる情報を指します。引数名は、認可プロバイダ・ファンクションに送信されるパラメータ名です。タスク4.3のJavaコードを参照してください

    単一認証

    ファンクションの引数

  5. 「ルート」で、次の情報を使用してモック・テスト用の単一ルートを作成します。

    • パス: /mockと入力します。
    • メソッド: 「GET」を選択します。
    • バックエンド・オプション: 「追加された単一バックエンドの編集」を選択します。
    • バックエンド・タイプ: 「Stock response」を選択します。

    ルート

  6. 「ルート」で、「モック・レスポンス」を定義し、「次へ」をクリックします。

    • ステータス・コード: 200と入力します。
    • 本文: {"mensagem" : "ok"}と入力します。
    • ヘッダー名: 「Content-Type」を選択します。
    • ヘッダー値: 「application/json; charset=UTF-8」を選択します。

    すべり台

  7. 「確認」で、構成を確認し、「変更の保存」をクリックしてデプロイメントの作成を完了します。

  8. curlコマンドを実行してAPIをテストします。

    # Invoke using <Verb Defined in Route> with the endpoint like: <API Gateway Hostname> + <Deployment Path Prefix> + <Route Path>
    # Send parameters, such as customer and token, in the Header with values configured in Task 4 - Step 5
    curl -i -H "customer: AAA" -H "token: 123456" -X GET https://yourapigatewayhosta.your-region.oci.customer-oci.com/authFunction/mock
    

    ファンクションの呼出し

    無効な情報を指定して起動した場合、レスポンスはHTTP/1.1 401 Unauthorizedになります。

    401ステータス

タスク6: OCI APIゲートウェイを使用した認可プロバイダ・ファンクションからのパラメータおよびスコープの取得

ノートタスク4でダウンロードしたJavaコードを参照してください。このタスクでは、APIゲートウェイ内でresult.contextおよびresult.scopeを操作する方法について説明します。

  1. 認可プロバイダ・ファンクションからコンテキスト値を取得します。

    コンテキスト変数

    認可プロバイダ・ファンクションから情報を取得し、APIゲートウェイ内で使用する必要があるシナリオを考えてみます。たとえば、認可トークンを使用してバックエンド・サービスを呼び出すことができます。

    ノート:このラボ・デモンストレーションでは、レスポンス・ヘッダーに情報が返されます。

  2. OCIコンソールに移動し、「開発者サービス」「API管理」「ゲートウェイ」に移動して、ゲートウェイを選択します。「デプロイメント」をクリックし、タスク5で作成したデプロイメントを選択して、「編集」をクリックします。

    デプロイメントの編集

  3. 「ルート」にナビゲートし、「ルート・レスポンス・ポリシーの表示」をクリックします。

    ルート・レスポンス

  4. 「レスポンス・ポリシー」「ヘッダー変換」で、「追加」をクリックして続行します。

    「追加」ボタン

  5. 「レスポンス・ヘッダー変換」ページで、次の図に示すようにAPIゲートウェイを構成し、「変更の適用」をクリックします。

    Javaコードからの両方のパラメータがAPIレスポンス・ヘッダーに含まれます。

    • ヘッダー名:このフィールドは、APIレスポンスのヘッダー属性の名前を指定します。
    • 値:このフィールドは、認可プロバイダ・ファンクションから取得される属性の名前を指定します。

    次のフォーマットを使用します:

    ${request.auth[attributeNameFromAuthorizerFunction]}
    
    #examples
    ${request.auth[valor01]}
    ${request.auth[valor02]}
    

    ヘッダー設定

  6. ヘッダー応答設定をレビューします。「次へ」をクリックして変更を確認し、「変更の保存」をクリックして適用します。

    ヘッダー設定の確認

  7. APIをテストし、レスポンス・ヘッダーを確認します。

    ヘッダー応答

  8. 認可プロバイダ・ファンクションのスコープ値を使用してセキュリティを強化する方法を明確にします。

    ノート:認可のコンテキストでは、スコープとは、ユーザーまたはアプリケーションに付与される特定の権限またはアクセス・レベルを指します。

    コンテキスト変数

    認可プロバイダ・ファンクションは、このAPIコールで使用可能なすべてのスコープ(この例ではハードコードされています)を返します。

    APIゲートウェイ・デプロイメントの一部のルートでは、セキュリティを強化するために特定のスコープのみを許可できます。

    OCIコンソールに移動し、「開発者サービス」「API管理」「ゲートウェイ」に移動して、ゲートウェイを選択します。「デプロイメント」をクリックし、タスク5で作成したデプロイメントを選択して、「編集」をクリックします。

    デプロイメントの編集

  9. 「ルート」にナビゲートし、「ルート・リクエスト・ポリシーの表示」をクリックします。

    ルート・リクエスト

  10. 「リクエスト・ポリシー」「認可」で、「編集」をクリックします。

    「Edit」ボタン

  11. 認可ポリシーで、「認可タイプ」として「任意」を選択し、認可プロバイダ・ファンクションによって返されたすべての「許可されたスコープ」を追加して、「変更の適用」をクリックします。

    認可ポリシー

  12. 「確認」で、変更内容を確認し、「次へ」をクリックし、「変更の保存」をクリックして変更を適用します。

    認可ポリシー

  13. APIをテストし、動作していることを確認します。スコープは認可プロバイダ・ファンクションによって返されます。

    テスト成功

  14. APIゲートウェイを変更して、認可プロバイダ・ファンクションによって返されないスコープを使用します。

    変更内容を確認し、「次へ」「変更の保存」の順にクリックして変更を適用します。

    スコープ失敗

  15. APIをテストし、結果を確認します。

    認可ポリシー

    レスポンスは、404 Not Found HTTPステータスになります。

    両方のヘッダーが返されるため、認可プロバイダの機能が正しく動作することを確認します。ただし、リクエスト・ポリシーのスコープ認可検証のため、ルート・バックエンドが失敗します。

承認

その他の学習リソース

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

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