创建 API 网关部署

使用您的函数准备就绪,您可以将 JWT 验证的本地验证机制与 Oracle Identity Cloud Service 进行集成和测试。

使用本机 JWT 验证创建 API 网关部署

通过使用 Oracle Cloud Infrastructure 网关本机 JWT 验证功能,可以为部署添加基于 Java Web 标记(JWT)的验证策略。

使用此 JWT 类型可以指定执行传入访问标记验证所需的数据(通过标头或参数)。策略需要以下信息:

  • 允许的发布者:标记发布者。会出现多个 OAuth 服务器,但在这种情况下,您将使用 https://identity.oraclecloud.com/
  • 受众:允许访问此令牌的资源。
  • 公共密钥:要用于在发布者和受众内验证标记的 Json Web 密钥集(JWKS)。允许两种类型的 Jwk:
    • 静态密钥:使用此选项,您需要使用 JSON 格式手动指定 JWKS,根据 RFC 7517 部分 4 应具有所需的属性。
    • 远程密钥:使用此选项,您需要指定可以使用 REST 从中使用 JWKS 的 URL。此功能的限制是指定的 URL 需要不受保护,因为此功能不支持读取受保护的 URL 来检索 jwps。
  • 高级选项
    • 秒为单位的最大时钟偏差:如果 API 网关与身份提供方的时间差不同,则使用此值可以调整标记有效性窗口时间,以尝试在两个服务之间保持时间。
    • 声明:在需要检入标记时验证赔。例如,client_id 声明或 user_id 索赔。

使用端点和 JWT 验证在 API 网关中创建新的部署名称以使路由达到在之前步骤中创建的函数。在此示例中,部署名为:my_jwt_test

  1. Oracle Cloud Infrastructure 控制台的 “API 网关”页中,通过单击活动网关的名称来选择它。
  2. 资源下,选择部署,然后选择创建部署
  3. 使用以下值配置验证策略:
    • 验证类型JWT
    • 验证标记:标
    • 标头名称授权
    • 验证方案Bearer
    • 启用匿名访问:启用
  4. Oracle Identity Cloud Service 域添加为允许的发布者,以便将其用作标记生成器。在发布者中,将允许的发布者设置为 https://identity.oraclecloud.com/
  5. 添加受众。将允许的受众设置为 Oracle Identity Cloud Service Oracle Functions 应用程序的 URL。例如,https://myinstance.apigateway.mydc.oci.customer-oci.com
    要验证的受众应是已生成标记需要能够访问的资源的受众。在这种情况下,我们希望来自 Oracle Functions Oracle Identity Cloud Service 应用程序资源所有者(资源范围是 Oracle Functions Oracle Identity Cloud Service 应用程序的主要受众)的 Oracle Identity Cloud Service 应用程序的标记。
  6. 添加要用于验证传入 JWT 标记的 JWK; 远程或静态 JWKS。要添加远程 Jwk,请执行以下操作:
    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 密钥。在 JSON Web 键中粘贴,只需使用您从 Oracle Identity Cloud Service 获得的值的以下子集。
      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 应用程序,并且将使用多个 Oracle Visual Builder Oracle Identity Cloud Service 应用程序生成 OAuth 标记,则需要将所有 Oracle Identity Cloud Service 客户机 id 添加到此验证步骤。将声明关键字设置为 client_id,输入一个或多个声明值,然后选中必需复选框。
  9. (可选)可以配置 CORS 以允许来自指定域的请求。例如,您可能需要允许 Oracle Visual Builder 服务器主机名作为请求的允许源。设置允许的源到服务器的 Url、要授权的公开的标头、允的标头启用允许身份证明以及允许的方法 执行 GET、POST
  10. 创建路由以指向函数,例如示例函数 saasopportunitiesfn。将路径设置为 /assertion/facall、将方法设置为 GETPOST入到 Oracle Functions,确保 <您的区间>中的应用程序选择了正确的区间,将应用程序设置为您的应用程序名称(例如 myapplication),并将函数名称设置为您的函数名称,例如 saasopportunitiesfn
保存更改后,可以复查 API 网关部署 my_jwt_test 有效负载的内容。

测试端点 REST 调用

要测试新的端点 REST 调用,可以使用 Postman 的“获取新的访问标记”功能。

请注意,如果在以下步骤中使用生成的标记,则无法直接访问 Oracle Fusion Applications Cloud Service 端点,这是因为标记是通过 Oracle Visual Builder 中的 Oracle Identity Cloud Service 应用程序生成的,并且只能按照您以前设置的范围访问 Oracle Functions。此外,如果使用不同的 Oracle Identity Cloud Service 应用程序生成标记,并且应用程序缺少访问 Oracle Functions 资源范围的授权,由于您添加了 Oracle Functions Oracle Identity Cloud Service 资源的受众,网关 API 将不允许请求(它将返回 401 错误)。如果您添加了声称客户机标识验证,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 资源的 ID。
  • ClientSecret:与 Oracle Visual Builder 关联的 Oracle Identity Cloud Service 应用程序客户端 Oracle Functions 资源的客户端密钥
  • 范围:此范围应与 Oracle Functions Oracle Identity Cloud Service 应用程序提供的资源匹配。例如,https://myservice.apigateway.dc1.oci.customer-oci.com/saasextension
  1. 调用配置的路由以使用 Postman 指向您的断言方函数以及上面列出的参数。
  2. 或者,使用曲线。例如:
    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 网关端点的入站调用的 Bearer 标记,请使用此方法。

如果您后跟来自选择性地在 Oracle Cloud Infrastructure 中定义验证函数部分的词干,则此函数是您定义的可选函数。

  1. 要部署 API 网关,请在 “API 网关”页中单击活动网关的名称以选择该网关。
  2. 资源下,单击部署,然后单击创建部署
  3. 使用“从暂存”模式,可以通过向导单击以部署 API 网关。
    或者,您可以选择上载部署定义文件,如下所述。

以下代码片段是可用于部署的 Oracle Cloud Infrastructure API 部署规范 JSON 文件的示例,而不是使用向导。在此文件中,我们可以看到:

  • 行 1-8:验证请求策略。这是指示对此部署中的任何请求执行的定义,首先调用此函数(functionId), 传递 tokenHeader, 如果该函数返回“”, 则继续,否则使用 HTTP 未授权消息响应。
  • 行 9-17:用于管理和控制跨源资源共享的 CORS 定义。
  • 第 18-43 行:FaaS 中有两个 URL 入口点/version 指向单个函数。
{
    "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>