APIゲートウェイ・デプロイメントの作成

関数の準備が整ったら、Oracle Identity Cloud ServiceでJWT検証を行うためのネイティブ認証メカニズムを統合およびテストできます。

ネイティブJWT検証によるAPIゲートウェイ・デプロイメントの作成

Oracle Cloud Infrastructure GatewayネイティブJWT検証機能を使用して、デプロイメントにJava Web Token (JWT)ベースの認証ポリシーを追加できます。

このJWTタイプでは、受信アクセス・トークンの検証を(ヘッダーまたはパラメータ経由で)実行するために必要なデータを指定できます。ポリシーには、次の情報が必要です。

  • 許可された発行者:トークン発行者。複数のOAuthサーバーがサポートされますが、この場合、https://identity.oraclecloud.com/を使用します。
  • オーディエンス:このトークンのアクセスを許可されるリソース。
  • 公開キー:発行者およびオーディエンス内で、トークンの検証に使用されるJson Webキー・セット(JWKS )。次の2種類のJWKSを使用できます。
    • 静的キー:このオプションを使用する場合は、RFC 7517項4に従って必要なプロパティを持つJSON形式を使用してJWKSを手動で指定する必要があります。
    • リモート・キー:このオプションを使用する場合、RESTを使用してjksを消費できるURLを指定する必要があります。この機能の制限は、現在この機能ではJWKSを取得するための保護されたURLの読取り機能がサポートされていないため、指定したURLの保護を解除する必要があることです。
  • 拡張オプション:
    • 最大クライアント・スキュー(秒単位): APIゲートウェイとアイデンティティ・プロバイダのタイミングに多少の違いがある場合、この値を使用すると、2つのサービス間でタイミングを調整するトークン有効性ウィンドウ時間を調整できます。
    • 要求:着信トークンの必要に応じて要求を検証するため。たとえば、client_id claimまたはuser_id claimです。

エンドポイントおよびJWT検証を使用して、前のステップで作成された関数に到達するためのルートを含むAPIゲートウェイに新しいデプロイメント名を作成します。この例では、デプロイメントにはmy_jwt_testという名前が付いています。

  1. Oracle Cloud InfrastructureコンソールのAPIゲートウェイ・ページで、その名前をクリックしてアクティブなゲートウェイを選択します。
  2. リソース」で、「デプロイメント」、「デプロイメントの作成」の順に選択します。
  3. 次の値を使用して認証ポリシーを構成します。
    • 認証タイプ: JWT
    • 認証トークン:ヘッダー
    • ヘッダー名:認可
    • 認証スキーム:ベアラー
    • 匿名アクセスの有効化:有効
  4. Oracle Identity Cloud Serviceドメインを許可された発行者として追加し、トークン・ジェネレータとして使用できるようにします。「発行者」で、「許可された発行者」をhttps://identity.oraclecloud.com/に設定します。
  5. オーディエンスを追加します。許可オーディエンスをOracle Identity Cloud Service Oracle Functions ApplicationのURLに設定します。たとえば、https://myinstance.apigateway.mydc.oci.customer-oci.comです。
    検証対象のオーディエンスは、生成されたトークンがアクセスできる必要があるリソースに対するオーディエンスである必要があります。この例では、Oracle Functions Oracle Identity Cloud Service App Resource ownerのクライアントであるOracle Identity Cloud Service App社のトークンが、Oracle Functions Oracle Identity Cloud Service Appのプライマリ・オーディエンスのリソース・スコープを備えているものと想定しています。
  6. 受信JWTトークン(リモートまたは静的jks)を検証するために使用するJWKを追加します。リモートJWKSを追加するには:
    1. Oracle Identity Cloud Serviceコンソールにアクセスします。
    2. 設定」を選択して、「デフォルト設定」を選択します。
    3. まだ有効になっていない場合、「署名証明書へのアクセス」を選択し、「保存」をクリックして、「はい」をクリックします。
    4. Oracle Identity Cloud ServiceインスタンスのJWK URLにアクセスします。たとえば、https://idcs-myinstance.identity.dc1.oraclecloud.com/admin/v1/SigningCert/jwkなどです。
    5. JWK URLが表示されることを確認したら、APIゲートウェイに戻り、公開キーを構成します。「タイプ」を「 リモートJWKS」に設定し、URIを検証したURLに設定します。
  7. 静的JWKSを追加するには:
    1. 「静的キー」フォームを定義します。そのためには、Oracle Identity Cloud ServiceのJWKをリクエストする必要があります。これは、curlを指定して実行できます。次に例を示します。
      ## Get access token to be able to invoke protected /admin/v1/SigningCert/jwk endpoint.
      # Clientid and ClientSecret should be from an existing IDCS Application in the stripe.
      #
      $ curl -X POST -u "<clientId>:<clientSecret>" https://idcs-myinstance.identity.dc1.oraclecloud.com/oauth2/v1/token -d "grant_type=client_credentials&scope=urn:opc:idm:__myscopes__"
       
       
      export jwtToken="<RETRIEVED_TOKEN>"
       
      ## Get JWK
      $ curl -X GET  https://idcs-myinstance.identity.dc1.oraclecloud.com/admin/v1/SigningCert/jwk -H "Authorization: Bearer ${jwtToken}"
       
      {
          "keys":[{
              "kty":"RSA",
              "x5t#S256":"<value>",
              "e":"<value>",
              "x5t":"<value>",
              "kid":"SIGNING_KEY",
              "x5c":["<value>"],
              "key_ops":["encrypt","verify","wrapKey"],
              "alg":"RS256",
              "n":"<value>"
          }]
      }
    2. APIゲートウェイで公開キーを構成します。「タイプ」を「静的キーに設定します。「キーID」を「SIGNING_KEY」に、「形式」を「JSON Webキーに設定します。Oracle Identity Cloud Serviceから取得した値の次のサブセットのみを使用して、JSON Webキーを貼り付けます。
      現在、APIゲートウェイではJWKキーの特定のプロパティのみがサポートされています。key_opsプロパティのかわりに、useプロパティを使用します。
      {
              "kty":"RSA",
              "e":"<value>",
              "kid":"SIGNING_KEY",
              "use":"sig",
              "alg":"RS256",   
              "n":"<value>"
      }
  8. オプションで、「請求の検証」セクションで追加の検証を追加できます。client_id要求を追加して、Oracle Visual Builderアプリケーションに関連付けられたOracle Identity Cloud Serviceアプリケーションに対応する値のみを許可します。複数のOracle Visual Builderアプリケーションがあり、OAuthトークンが複数のOracle Visual Builder Oracle Identity Cloud Serviceアプリケーションを使用して生成される場合は、すべてのOracle Identity Cloud Serviceクライアントidをこの検証ステップに追加する必要があります。「要求キー」を「client_id」に設定し、1つ以上の「要求値」を入力して「必須」チェック・ボックスを選択します。
  9. オプションで、指定したドメインからのリクエストを許可するようにCORSを構成できます。たとえば、Oracle Visual Builderサーバーのホスト名を許可されているリクエストの起点として許可することが必要な場合があります。「許可されているオリジン」をサーバーのUrl、「公開されたヘッダー」を「認可」、「許可されたヘッダー」を「はい」に、「資格証明を許可する」を「はい」に、「許可されたメソッド」を「GET」、「POST」に設定します。
  10. 関数を指すルートを作成します(例:関数saasopportunitiesfn )。パス/assertion/facall、GETおよびPOSTに設定、Oracle Functions入力、コンパートメント >アプリケーションで正しいコンパートメントが選択されていることを確認し、アプリケーションをmyapplicationなどのアプリケーション名に設定し、「 ファンクション名」にsaasopportunitiesfnなどのファンクション名を設定します。
変更を保存した後、APIゲートウェイ・デプロイメントmy_jwt_testペイロードのコンテンツを確認できます。

エンドポイントのREST呼出しのテスト

新しいエンドポイントのREST呼出しをテストするには、Postmanの「新しいアクセス・トークンの取得」機能を使用します。

次のステップで生成されたトークンを使用すると、Oracle Fusion Applications Cloud Serviceエンドポイントに直接アクセスできなくなります。これは、トークンがOracle Visual BuilderからOracle Identity Cloud Service Appによって生成され、以前に設定したスコープごとに、現在の構成を使用してOracle Functionsに到達できるためです。また、別のOracle Identity Cloud Service Appを使用してトークンを生成し、そのアプリケーションにOracle Functions Resource Scopeに到達する権限がない場合、Oracle Functions Oracle Identity Cloud Service Resourceのオーディエンスを追加したため、API Gatewayではリクエストが許可されません(401エラーが返されます)。要求クライアントId検証を追加した場合、APIゲートウェイでは、指定されたOracle Identity Cloud Serviceアプリケーションclient_idsとのみトークンが一致するようにします。

次のパラメータを使用してテストします。

  • 権限付与タイプ: パスワード資格証明 -この権限付与タイプは、指定されたユーザー名が生成されたトークンのサブジェクトであることを確認するために使用します。
  • アクセス・トークンURL: Oracle Identity Cloud ServiceインスタンスのOAuth URL。たとえば、https://idcs-myinstance.identity.dc1.oraclecloud.com/oauth2/v1/tokenです。
  • ユーザー名: Oracle Identity Cloud ServiceOracle Fusion Applications Cloud Serviceの両方に存在し、両方の適切な権限が付与されたユーザー。
  • パスワード:このユーザーのパスワードを入力します。
  • ClientId: Oracle Visual Builderに関連付けられたOracle Identity Cloud Service Client Oracle Functions ResourceのID。
  • ClientSecret: Oracle Visual Builderに関連付けられたOracle Identity Cloud Service App Client Oracle Functions Resourceのクライアント・シークレット
  • スコープ:このスコープは、Oracle Functions Oracle Identity Cloud Service App provided Resourcesと一致する必要があります。例: https://myservice.apigateway.dc1.oci.customer-oci.com/saasextension
  1. Postmanおよび前述のパラメータを使用して、asserter関数を指すように構成されているルートを起動します。
  2. または、curlを使用してください。次に例を示します。
    curl --location --request GET 'https://myservice.apigateway.dc1.oci.customer-oci.com/saasextension/assertion/facall' \
    --header 'Authorization: Bearer <JWT_TOKEN>'
次のように、いずれかのツールから結果を取得します。
{
  "principal": "mary.jane",
  "gotPrincipalFrom": "BEARER",
  "statusCode": "200",
  "response": {
    "items": [],
    "count": 0,
    "hasMore": false,
    "limit": 25,
    "offset": 0,
    "links": [
      {
        "rel": "self",
        "href": "https://myfusionservice.fa.dc1.oraclecloud.com:443/fscmRestApi/resources/11.13.18.05/expenses",
        "name": "expenses",
        "kind": "collection"
      }
    ]
  }
}

カスタム認証によるAPIゲートウェイ・デプロイメントの作成(オプション)

カスタム認証ファンクションを使用して、APIゲートウェイ・エンドポイントへのインバウンド・コールのベアラー・トークンを検証する場合は、この方法を使用します。

これは、Oracle Cloud Infrastructureセクションのオプションの「認証ファンクションの定義」からstetpsを実行した場合に定義したオプションの関数です。

  1. APIゲートウェイをデプロイするには、「APIゲートウェイ」ページで、アクティブなゲートウェイの名前をクリックして選択します。
  2. リソース」で、「デプロイメント」、「デプロイメントの作成」の順にクリックします。
  3. 「最初から」モードを使用すると、ウィザードをクリックしてAPIゲートウェイをデプロイできます。
    または、次に説明するように、デプロイメント定義ファイルのアップロードを選択できます。

次のコード・スニペットは、ウィザードを使用せずにデプロイに使用できるOracle Cloud Infrastructure APIデプロイメント仕様のJSONファイルの例です。このファイル内では次のものが表示されます。

  • 1から8行:認証リクエスト・ポリシー。これは、このデプロイメントのリクエストに対して、最初にこの関数(functionId)をコールし、tokenHeaderを渡し、trueを返した場合は続行することを指示する定義で、そうでない場合はHTTPの未認可メッセージで応答します。
  • 明細9 -17: Cross - Origin Resource Sharingを管理および制御するCORS定義。
  • 18 -43: FaaSの個々の関数に対する2つのURLエントリ・ポイント/dbb。
{
    "requestPolicies": {
      "authentication": {
        "type": "CUSTOM_AUTHENTICATION",
        "isAnonymousAccessAllowed": true,
        "functionId": "OCID1.fnfunc.oc1.phx.xxxxxxxxxxxxxxx",
        "tokenHeader": "Authorization"
      }
      "cors":{ 
         "allowedOrigins": [<list-of-origins>], 
         "allowedMethods": [<list-of-methods>], 
         "allowedHeaders": [<list-of-implicit-headers>], 
         "exposedHeaders": [<list-of-exposed-headers>], 
         "isAllowCredentialsEnabled": <true|false>, 
         "maxAgeInSeconds": <seconds> 
      } 
    },
    "routes": [
      {
        "path": "/opportunities",
        "methods": [
          "GET"
        ],
        "requestPolicies": {},
        "backend": {
          "type": "ORACLE_FUNCTIONS_BACKEND",
          "functionId": "OCID1.fnfunc.oc1.phx.xxxxxxxxxxxxxxx"
 
        }
      },
      {
        "path": "/opportunities/{optyid}",
        "methods": [
          "PATCH"
        ],
        "requestPolicies": {},
        "backend": {
          "type": "ORACLE_FUNCTIONS_BACKEND",
          "functionId": "OCID1.fnfunc.oc1.phx.xxxxxxxxxxxxxxx"
        }
      }
    ]
  }
</seconds></true|false></list-of-exposed-headers></list-of-implicit-headers></list-of-methods></list-of-origins>