注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 OCI API 网关将 OCI 流处理与其他授权方法集成
简介
我们经常需要应用来使用 Oracle Cloud Infrastructure (OCI) REST 服务。有多种方法可以保证组件之间的安全性,确保应用程序可以安全地向后端服务进行验证。
大多数情况下,此任务是 Oracle Cloud 中的原生任务,因为有多种方法可以保护网络和访问现有服务。只是一些设置,你已经完成了。但是,在某些情况下,应用程序可能会提供额外的安全和连接要求。本教程的用例满足了混合云或多云方案(连接到 Oracle Cloud 的本地部署或连接到其他云的 Oracle Cloud)中非常常见的需求。
让我们演示以下方案:
-
通过 Fast-Connect/VPN 连接到 Oracle Cloud 的内部部署网络上的应用。
-
应用需要使用 OCI Streaming 服务。
-
OCI 服务没有满足应用使用者可能性的身份验证机制。
-
应用程序需要使用 OAuth2 进行验证才能安全地访问服务。
因此,本教程提供了以下解决方案:
-
将 Oracle Identity Cloud Service 云自己的身份提供者配置为通过 OAuth2 进行验证。
-
配置 OCI API 网关以与 Oracle Identity Cloud Service 集成,以通过获取的令牌进行验证。
-
对函数进行编码以生成 OCI 流处理的验证(
draft-cavage-http-signatures-08
方法)。 -
创建组和策略来限制对云资源的访问。
-
提供允许您传递客户端 ID 和密钥 ID 并获取验证令牌的身份提供者。
-
提供通过获取的令牌进行验证并允许使用者使用 OCI 流处理服务的功能性 API 网关 REST 服务。
注意:可以在此处下载 OCI 函数代码:OAuthOCIService-fn.zip 。
目标
-
允许外部应用程序通过 OAuth2 验证使用 OCI REST 服务。
-
在 OCI 上提供 OAuth2 验证服务。
-
配置 OCI API Gateway 和 OCI Functions 以通过令牌运行 OCI 服务。
先决条件
-
OCI API 网关实例已创建并公开给 Internet。有关详细信息,请参阅在 Oracle Cloud 中创建第一个 API 网关。
-
OCI API 网关、OCI 函数和 OCI PaaS 资源之间的网络连接。
-
VCN/子网
-
安全列表
-
NAT 网关/Internet 网关
-
公共/专用网络
-
-
了解 OCI Functions 和 OCI REST API 来编写 OCI 服务调用的代码。
任务 1:使用 Oracle Identity Cloud Service 配置 OAuth2
-
获取 OCI API 网关参数:开始配置 OAuth2 机制。我们需要通过将 Oracle Cloud 中的 Oracle Identity Cloud Service 配置为身份提供者,将您的 OCI API 网关实例集成到身份提供者中。
-
转到 OCI API 网关实例并复制主机名。在下一步中,将在 Oracle Identity Cloud Service 资源服务器配置中使用此信息。
-
-
创建资源应用程序:我们需要为您的应用程序创建 OAuth2 授权者。我们可以使用 Oracle Cloud 中的 Oracle Identity Cloud Service 来做到这一点。
-
在 OCI 控制台中,转至身份与安全,然后选择联盟。
-
单击 OracleIdentityCloudSevice 。
-
单击 Oracle Identity Cloud Service 实例的 Oracle Identity Cloud Service 控制台链接。
-
我们将创建两个应用程序。单击“应用程序和服务”。
-
在应用程序中,单击添加。
-
选择机密应用程序以开始配置资源服务器。
-
我们将配置第一个应用程序。在资源服务器应用程序中输入名称,然后单击下一步。
-
单击跳过以供以后使用。我们只需要配置资源。
-
输入在步骤 1 中获取的 API 网关主机名。
-
单击添加范围并输入范围信息。
-
查看范围信息,单击 Next 两次,然后单击 Finish 。
-
单击激活以激活应用程序。
-
-
创建客户机应用程序。
-
在“应用程序”中,单击添加。
-
选择机密应用程序以开始配置资源服务器。
-
为应用程序输入名称,然后单击下一步。
-
选择立即将应用程序配置为客户端以启用客户端应用程序的配置。选择 Client Credentials(客户端身份证明)、 JWT Assertion(JWT 断言)和 代表。
注意:如果要在函数代码中验证 OAuth2,则必须设置潜在客户标志。这将启用
/oauth2/v1/introspect
Oracle Identity Cloud Service REST API 服务。 -
向下滚动并单击添加范围。
-
查找在 (
oauth_resource_server
) 之前创建的资源应用程序,然后单击添加。 -
您可以看到您的范围已添加到您的应用程序。单击下一步。
注意:请注意范围值,您需要使用它来请求令牌。
-
跳过资源和 Web 层策略窗口。在 Authorization(授权)中,选择 Enforce Grants as Authorization(将授权强制为授权)并单击 Finish(完成)。
-
请注意客户端 ID 和客户端密钥信息。您将需要它来获取您的令牌。
-
单击激活可激活应用程序,并且您的 OAuth2 授权者已准备好进行测试。
-
-
获取令牌:现在我们可以测试 OAuth2 授权者以获取令牌。
-
编写授权者的 URL。您可以通过在浏览器中获取 Oracle Identity Cloud Service URL 来获取此信息。在 Oracle Identity Cloud Service URL 中,您可以看到如下内容:
https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole
。 -
您将需要 URL 链接,直到
oraclecloud.com
(即根端点)为止。例如,https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com
。 -
我们需要添加 oAuth 验证路径。此 URL 将作为
POST
REST 请求执行。例如,https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/oauth2/v1/token
。您需要输入一些参数来请求令牌。 -
以基本验证、客户端 ID 和客户端密钥形式输入身份证明。
-
在 Body 内容中,输入 grant_type 和 scope 值。请记住,该范围是在 Oracle Identity Cloud Service 配置中捕获的。
-
单击发送并执行
POST
请求并查看令牌。
-
任务 2:配置 OCI 函数以调用 OCI SDK API
-
了解 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 进行验证。
-
了解代码:此代码将用于 OCI API 网关。在您的 API 部署中,我们将在 OCI API 网关中配置 OCI 流处理端点,并将其作为 HEADER 授权参数传递。因此,您可以将此功能用于所需的每个 OCI API 网关部署中的许多服务。
-
在 Python 中,此函数将创建验证格式的日期和时间。此日期和时间需要生成一次,并用在两个点。到 OCI 流处理请求上的标头日期和签名加密 HEADER。
-
这是用于签名加密的功能。该组件包括将 OCI IAM 用户的私钥与 SHA-256 一起使用,然后在 base64 中使用。
-
签名加密将用于完整的授权题头。
-
这是 Oracle Identity Cloud Service OAUTH2 标记验证代码。您需要使用 Oracle Identity Cloud Service 应用程序参数配置
config.json
文件。 -
这是该函数的开始,并初始化为此 API 部署(
streaming_host
和oci_region
)创建的 OCI IAM 安全和 OCI 流处理变量中的一些信息。 -
这是这个函数的主要部分,有两个部分。
在第一部分中,我们获取在 API 网关请求中传递的令牌。在此之后,我们调用 auth_idcs() 函数以验证 Oracle Identity Cloud Service 中的令牌。生成 draft-cavage-http-signatures-08 字符串之前,先验证 Oracle Identity Cloud Service 标记。如果不是有效令牌,响应将出现 401 unauthorized 错误。
在第二部分中,我们将创建两个值。带有日期格式的日期 (d) 将用于签名的创建 (a)。rdata 将使用 authorization 和 date 值为函数构造响应,OCI API 网关将使用这些值在 OCI Streaming 上进行验证。
-
在此,我们可以在 OCI Observability 中生成日志,此步骤是可选的。输入日志的 Oracle Cloud 标识符 (OCID) 。您需要以前创建定制日志。
注意:要在 OCI Observability 中创建定制日志,请参阅使用 OCI API Gateway、Functions 和 Observability 验证 JSON 内容并监视 API 标头和正文。
-
这是最后一步,通过有效的验证返回。
这是需要在此函数 (fn) 中装入的
requirements.txt
库。requirements.txt --------------------- fdk>=0.1.54 requests oci cryptography six PyJWT py3_lru_cache simplejson
这是
config.json
文件。这是 OCI 配置文件。您可以从 OCI CLI 安装复制此文件,但必须修改
key_file
部分并删除 OCI CLI 安装的路径。这将在 Python 代码中使用以生成draft-cavage-http-signatures-08
加密字符串。在部署函数之前,请创建两个变量并填写 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 网关中对其进行配置。
-
任务 3:配置 API 网关部署
注意:开发函数并在 OCI API 网关中调用它,请参阅 OCI 函数:使用 API 网关验证 API 密钥。
-
配置 OCI API 网关服务。在此示例中,我们将配置 OCI 流处理服务。在基本信息中,输入路径前缀为
/20180418/streams/
以及流处理实例的 OCID。例如:
/20180418/streams/ocid1.stream.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
-
在 "Authentication" 中,选择 Single Authentication 和 Authorizer Function 。选择区间和 Oracle 函数作为
get-authorization
。 -
配置您的请求 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
-
要为 Oracle Identity Cloud Service 参数配置 HEADER,您需要单击显示路由请求策略。
-
在 HEADER 转换中,单击编辑并在两个参数中输入 Behavior 到
Overwrite
,将 HEADER name 分别输入Authorization
、Date
和 Values 分别输入${request.auth[authorization]}
和${request.auth[date]}
。${request.auth[authorization]}
和${request.auth[date]}
是函数 Python 代码返回的值,将作为后端服务的 HEADER 传递。
任务 4:配置 OCI 组和策略
要为 OCI 流处理配置策略,请参阅 OCI 流处理策略,您可以使用常用策略,请参阅常用策略。
任务 5:测试 API
让我们在 OCI Streaming 中模拟您的模型部署服务的应用程序 OAuth2 请求。
-
获取令牌并将客户端 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
-
测试对 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.
这就是结果。
在日志中,您可以查看自定义代码授权逻辑的有效负载。
相关链接
确认
- 作者 — Cristiano Hoshikawa(Oracle LAD A-Team 解决方案工程师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Integrate OCI Streaming with Other Authorization Methods Using OCI API Gateway
F91395-02
November 2024