注意:

使用 OCI API 网关将 OCI 流处理与其他授权方法集成

简介

我们经常需要应用来使用 Oracle Cloud Infrastructure (OCI) REST 服务。有多种方法可以保证组件之间的安全性,确保应用程序可以安全地向后端服务进行验证。

大多数情况下,此任务是 Oracle Cloud 中的原生任务,因为有多种方法可以保护网络和访问现有服务。只是一些设置,你已经完成了。但是,在某些情况下,应用程序可能会提供额外的安全和连接要求。本教程的用例满足了混合云或多云方案(连接到 Oracle Cloud 的本地部署或连接到其他云的 Oracle Cloud)中非常常见的需求。

让我们演示以下方案:

因此,本教程提供了以下解决方案:

注意:可以在此处下载 OCI 函数代码:OAuthOCIService-fn.zip

目标

先决条件

任务 1:使用 Oracle Identity Cloud Service 配置 OAuth2

  1. 获取 OCI API 网关参数:开始配置 OAuth2 机制。我们需要通过将 Oracle Cloud 中的 Oracle Identity Cloud Service 配置为身份提供者,将您的 OCI API 网关实例集成到身份提供者中。

    • 转到 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. 我们将创建两个应用程序。单击“应用程序和服务”

      img.png

    5. 在应用程序中,单击添加

      img.png

    6. 选择机密应用程序以开始配置资源服务器。

      img.png

    7. 我们将配置第一个应用程序。在资源服务器应用程序中输入名称,然后单击下一步

      img.png

    8. 单击跳过以供以后使用。我们只需要配置资源。

      img.png

    9. 输入在步骤 1 中获取的 API 网关主机名。

      img.png

    10. 单击添加范围并输入范围信息。

      img.png

    11. 查看范围信息,单击 Next 两次,然后单击 Finish

      img.png

    12. 单击激活以激活应用程序。

      img.png

  3. 创建客户机应用程序

    1. 在“应用程序”中,单击添加

      img.png

    2. 选择机密应用程序以开始配置资源服务器。

      img.png

    3. 为应用程序输入名称,然后单击下一步

      img_1.png

    4. 选择立即将应用程序配置为客户端以启用客户端应用程序的配置。选择 Client Credentials(客户端身份证明)JWT Assertion(JWT 断言)代表

      img.png

      注意:如果要在函数代码中验证 OAuth2,则必须设置潜在客户标志。这将启用 /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 层策略窗口。在 Authorization(授权)中,选择 Enforce Grants as Authorization(将授权强制为授权)并单击 Finish(完成)

      img.png

    9. 请注意客户端 ID客户端密钥信息。您将需要它来获取您的令牌。

      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. 基本验证客户端 ID客户端密钥形式输入身份证明。

      img.png

    5. Body 内容中,输入 grant_typescope 值。请记住,该范围是在 Oracle Identity Cloud Service 配置中捕获的。

      img.png

    6. 单击发送并执行 POST 请求并查看令牌。

      img_2.png

任务 2:配置 OCI 函数以调用 OCI SDK API

  1. 了解 OCI 函数和 OCI API 网关:最佳做法是通过 OCI API 网关公开您的服务。可以绕过从 OCI API 网关到后端服务的身份证明进行验证,但如果后端验证不是适用于客户端应用程序的方法,则可以在 OCI API 网关级别执行某些配置。

    在此步骤中,让我们了解 OCI API Gateway 如何帮助我们通过 OCI Functions 集成 OAuth2 验证和任何 OCI 服务的请求,例如 OCI Streaming。

    OCI 函数可以执行相应任务来生成正确的验证/授权,并将其传递到 OCI 服务,而无需将用户凭据或私钥传递给使用者应用。OCI 服务中的某些服务无法使用 OAuth2 方法进行验证,因此我们可以使用 OCI Functions 进行验证。要创建和部署 OCI 函数,请参阅 OCI 函数快速入门

    在此示例中,OCI 流处理服务可以通过 draft-cavage-http-signatures-08 方法通过 OCI IAM 中的 OCI 私钥进行验证,而使用者可以通过 OAuth2 进行验证。

  2. 了解代码:此代码将用于 OCI API 网关。在您的 API 部署中,我们将在 OCI API 网关中配置 OCI 流处理端点,并将其作为 HEADER 授权参数传递。因此,您可以将此功能用于所需的每个 OCI API 网关部署中的许多服务。

    img_12.png

    • 在 Python 中,此函数将创建验证格式的日期和时间。此日期和时间需要生成一次,并用在两个点。到 OCI 流处理请求上的标头日期签名加密 HEADER。

      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 部署(streaming_hostoci_region)创建的 OCI IAM 安全和 OCI 流处理变量中的一些信息。

      img_4.png

    • 这是这个函数的主要部分,有两个部分。

      在第一部分中,我们获取在 API 网关请求中传递的令牌。在此之后,我们调用 auth_idcs() 函数以验证 Oracle Identity Cloud Service 中的令牌。生成 draft-cavage-http-signatures-08 字符串之前,先验证 Oracle Identity Cloud Service 标记。如果不是有效令牌,响应将出现 401 unauthorized 错误。

      在第二部分中,我们将创建两个值。带有日期格式的日期 (d) 将用于签名的创建 (a)。rdata 将使用 authorizationdate 值为函数构造响应,OCI API 网关将使用这些值在 OCI Streaming 上进行验证。

      img_15.png

    • 在此,我们可以在 OCI Observability 中生成日志,此步骤是可选的。输入日志的 Oracle Cloud 标识符 (OCID) 。您需要以前创建定制日志

      注意:要在 OCI Observability 中创建定制日志,请参阅使用 OCI API Gateway、Functions 和 Observability 验证 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

    在部署函数之前,请创建两个变量并填写 OCI 流 OCIDOCI 区域值,如下所示。

    fn config app <function-app> streaming_host ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxqhgw275qp7a
    fn config app <function-app> oci_region us-ashburn-1
    

    部署您的功能,让我们在 OCI API 网关中对其进行配置。

任务 3:配置 API 网关部署

注意:开发函数并在 OCI API 网关中调用它,请参阅 OCI 函数:使用 API 网关验证 API 密钥

  1. 配置 OCI API 网关服务。在此示例中,我们将配置 OCI 流处理服务。在基本信息中,输入路径前缀/20180418/streams/ 以及流处理实例的 OCID。

    例如:/20180418/streams/ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxx

    img.png

  2. 在 "Authentication" 中,选择 Single AuthenticationAuthorizer Function 。选择区间和 Oracle 函数作为 get-authorization

    img.png

  3. 配置您的请求 HEADERs 参数。

    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 转换中,单击编辑并在两个参数中输入 BehaviorOverwrite,将 HEADER name 分别输入 AuthorizationDateValues 分别输入 ${request.auth[authorization]}${request.auth[date]}${request.auth[authorization]}${request.auth[date]} 是函数 Python 代码返回的值,将作为后端服务的 HEADER 传递。

    img.png

任务 4:配置 OCI 组和策略

要为 OCI 流处理配置策略,请参阅 OCI 流处理策略,您可以使用常用策略,请参阅常用策略

任务 5:测试 API

让我们在 OCI Streaming 中模拟您的模型部署服务的应用程序 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 。您需要在请求的身体中声明六个头部。

    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 帮助中心