注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于云环境的值。
在 OCI API 网关中启用 OAuth2 验证,以使用 OCI Functions 和 OCI SDK 调用 OCI 服务
简介
我们通常需要应用来使用 Oracle Cloud Infrastructure (OCI) REST 服务。可以通过多种方式来确保组件之间的安全性,从而确保应用可以安全地向后端服务进行身份验证。
此任务是 Oracle Cloud 中的原生任务,因为有多种方法可以保护网络和访问现有服务。只有几个设置,你完成了。但是,在某些情况下,应用程序可能会提供额外的安全和连接要求。此材料的用例满足了混合或多云方案(连接到 Oracle Cloud 的内部部署或连接到其他云的 Oracle Cloud)中非常常见的需求。
我们来演示以下方案:
-
通过 Fast-Connect/VPN 连接到 Oracle Cloud 的内部部署网络上的应用。
-
应用需要使用 OCI 数据科学服务。
-
OCI 服务没有满足应用使用者可能性的身份验证机制。
-
应用程序需要使用 OAuth2 进行验证才能安全地访问服务。
因此,本教程提供了以下解决方案:
-
配置 Oracle Identity Cloud Service 云自己的身份提供者以通过 OAuth2 进行验证。
-
配置 OCI API 网关以与 Oracle Identity Cloud Service 集成,以通过获取的令牌进行验证。
-
编写 OCI 函数的代码,以调用允许使用资源主体的 OCI 服务(在我们的示例中,我们将使用数据科学模型部署服务)。
-
创建组和策略来限制对云资源的访问。
-
提供身份提供者,允许您传递客户机 ID 和密钥 ID 并获取验证令牌。
-
提供功能强大的 OCI API Gateway REST 服务,通过获取的令牌进行身份验证并提供数据科学服务结果。
注:您可以从此处 OAuthOCIService-fn.zip 下载 OCI 函数。
目标
-
允许外部应用程序通过 OAuth2 验证使用 REST 服务。
-
在 OCI 上提供 OAuth2 验证服务。
-
配置 OCI API 网关和 OCI 函数以通过令牌运行 OCI 服务。
先决条件
-
创建并公开到 Internet 的 OCI API 网关实例,请参阅在 Oracle Cloud 中创建第一个 API 网关。
-
OCI API 网关、OCI Functions 和 OCI PaaS 资源之间的网络连接。
-
VCN/子网
-
安全列表
-
NAT 网关/Internet 网关
-
公共/专用网络
-
-
具有以下功能的知识:
-
OCI 函数
-
OCI REST API 编码 OCI 服务调用
-
任务 1:使用 Oracle Identity Cloud Service 配置 OAuth2
-
获取 OCI API Gateway 参数:开始配置 OAuth2 机制。我们需要通过将 Oracle Cloud 中的 Oracle Identity Cloud Service 配置为身份提供者,将您的 OCI API 网关实例集成到身份提供者。
转到 OCI API Gateway 实例并复制主机名。此信息将在下一步的 Oracle Identity Cloud Service 资源服务器配置中使用。
-
创建资源应用程序:我们需要为您的应用程序创建 OAuth2 授权程序。我们可以利用 Oracle Cloud 中的 Oracle Identity Cloud Service 来做到这一点。
-
在 OCI 控制台中,转至身份和安全,然后选择联盟。
-
单击 OracleIdentityCloudSevice 。
-
单击 Oracle Identity Cloud Service 实例的链接。
-
我们将创建两个应用程序。单击应用程序和服务。
-
在“应用程序”中,单击添加。
-
选择 Confidential Application(机密应用程序)以开始配置资源服务器。
-
我们将配置第一个应用程序。在资源服务器应用程序中输入名称,然后单击下一步。
-
单击 Skip for later(跳过)。我们只需要配置资源。
-
输入在步骤 1 中获取的 OCI API 网关主机名。
-
单击添加范围并输入范围信息。
-
查看范围信息,两次单击下一步,然后单击完成。
-
单击激活以激活您的应用程序。
-
-
创建客户机应用程序。
-
在“应用程序”中,单击添加。
-
选择 Confidential Application(机密应用程序)以开始配置资源服务器。
-
为应用程序输入名称,然后单击下一步。
-
选择 Configure the application as a client now(立即将应用程序配置为客户端)以启用客户端应用程序的配置。选择客户端身份证明、 JWT 断言和代表。
-
向下滚动屏幕并单击添加范围。
-
查找之前创建的资源应用程序(在此任务中为
oauth_resource_server
),然后单击添加。 -
您可以看到您的范围已添加到应用程序中。单击下一步。
注:保留范围值,您需要使用它来请求令牌。
-
跳过资源和 Web 层策略窗口。在授权中,选择强制授权为授权,然后单击完成。
-
保留客户端 ID 和客户端密钥信息。您需要这样做才能获取令牌。
-
单击激活可激活应用程序,并且 OAuth2 授权者已准备好进行测试。
-
-
获取令牌:现在我们可以测试 OAuth2 授权程序以获取令牌。
-
编写授权者的 URL。您可以通过在浏览器中获取 Oracle Identity Cloud Service URL 来获取此 URL。在 Oracle Identity Cloud Service URL 中,您可以看到如下内容:
https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole
。 -
在
oraclecloud.com
(根端点)之前,您将需要 URL 链接。例如,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
请求并查看标记。
-
-
创建 JSON Web 密钥 (JWK) :在浏览器中,输入根 Oracle Identity Cloud Service 端点,添加
/admin/v1/SigningCert/jwk
以获取 JWK:https://idcs-xxxxxxxxxxxxx.identity.oraclecloud.com/admin/v1/SigningCert/jwk
您将收到如下所示的 JWK 字符串。
我们需要处理此 JWK 字符串。
{"keys":[{"kty":"RSA","x5t#S256":"gHdIaH54tZt-b09W7_bTALX0DSj5t_Tsy6Wy2P1M_3E","e":"AQAB","x5t":"L_vneVBMiKA-ObXpNt8FZC4sRSY","kid":"SIGNING_KEY","x5c":["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"],"key_ops":["sig","encrypt"],"alg":"RS256","n":"khfJqiO57xMlci4mtvirEGoDfPflsLWQd3G0ZkQQlQK2QcraQRQPkaoP8Lo6KMKA-1mV1TxGfd9QMx9ONmtRL8RIWvt0543Fae6wPfRpaeIcDpknsHAovsTdQ9SwfqwhF7slDg4ciEJ7-gdpCJKMVQcnsiWBDPCoIC1xzB7KbGKrWvaPAmxx1hoM4etjPwBy8h_JvHMfDEF1GkrUtCDiLFPyGBLPv50hmyN6mnTu47lBhzIwzeZ4HqZLgrOdqdA6iSZrBxRzHDi1IWqoj87FYpztkWXnV7VkIN37RwrG6bFKOHGaYEydoF0LmI4pltssTxsdtLyN-Hr8fM402cs7Iw"}]}
注:
-
此 JWK 已编辑。
-
如果收到错误消息,则需要在 Oracle Identity Cloud Service 中提供访问权限。
JWK 字符串的重要更改:在进行某些更改之前,JWK 字符串在 OCI API Gateway 中将不可用。
-
找到带有 "key_ops":["x","y","z"] 的段,然后替换为 "use" :"sig" 。如下所示(比较两个字符串)。
{"keys":[{"kty":"RSA","x5t#S256":"gHdIaH54tZt-b09W7_bTALX0DSj5t_Tsy6Wy2P1M_3E","e":"AQAB","x5t":"L_vneVBMiKA-ObXpNt8FZC4sRSY","kid":"SIGNING_KEY","x5c":["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"],"use" : "sig","alg":"RS256","n":"khfJqiO57xMlci4mtvirEGoDfPflsLWQd3G0ZkQQlQK2QcraQRQPkaoP8Lo6KMKA-1mV1TxGfd9QMx9ONmtRL8RIWvt0543Fae6wPfRpaeIcDpknsHAovsTdQ9SwfqwhF7slDg4ciEJ7-gdpCJKMVQcnsiWBDPCoIC1xzB7KbGKrWvaPAmxx1hoM4etjPwBy8h_JvHMfDEF1GkrUtCDiLFPyGBLPv50hmyN6mnTu47lBhzIwzeZ4HqZLgrOdqdA6iSZrBxRzHDi1IWqoj87FYpztkWXnV7VkIN37RwrG6bFKOHGaYEydoF0LmI4pltssTxsdtLyN-Hr8fM402cs7Iw"}]}
-
从开头删除字符串
{"keys":[
,从结尾删除字符串]}
。最终字符串将如下所示。现在你可以用了。{"kty":"RSA","x5t#S256":"gHdIaH54tZt-b09W7_bTALX0DSj5t_Tsy6Wy2P1M_3E","e":"AQAB","x5t":"L_vneVBMiKA-ObXpNt8FZC4sRSY","kid":"SIGNING_KEY","x5c":["MIIDYTCCAkmgAwIBAgIGAXRBgoJkiaJk/IsZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZvcmFjbGUxFTATBgoJkiaJk/IsZAEZFgVjEtMjAeFw0yMDA0MTcxMDU3NTRaFw0zMDA0MTcxMDU3NTRaMFYxEzARBgNVBAMTCnNzbERvbWFpbnMxDzGA1UEAxMlaWRjcy00ZmI0N2I5MTYxMzA0YjFkYTI2ZjZlZDE2MTlhNGUwOTCCASIwDQYJKoZIhvcNAQJIXyaojue8TJXIuJrb4qxBqA3z35bC1kHdxtGZEEJUCtkHK2kEUD5GqD/C6OijCgPtZldU8Rn3fUDMfTjZrUS/ESFr7dOeNxWnusD30aWniHIRe7JQ4OHIhCe/oHaQiSjFUHJ7IlgQzwqCAtccweymxiq1r2jwJscdYaDOHrYz8AcvIfybxzHwT8hgSz7+dIZsjepp07uO5QYcyMM3meB6mS4KznanQOokmawcUcxw4tSFqqI/OxWKc7ZBMnaBdC5iOKZbbLE8bHbS8jfh6/HzONNnLOyMCAwEAAaMyMDAwDwYDVR0PAQH/BAUDAwf4ADAdBgNVHQ4EFgQUd415wDQYJKoZIhvcNAQELBQADggEBAClHD810UCnRuvS7Rbtp5UFTzeRvexDe+Jk6/1FdcfW4COWLRVrgY45XHQr2GmhPWC1G2Yn8WczkIErpX+LAtyFSyOYxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxhvGsA6gj55ZLAynSnzMtPs+2Ij4F3PgkgJG7zxHs9HOuyuZtCKJAldVv7IFaQYv6yMjH7llehQOMwp1YPh54kk8M4yk1IIgi/Hw4Tr/HbU7r2EJyaHfxFZgck1Cr9nBIspANy5BDlFYeAnTmKk3UAafbZdSMfeJFd/XwaPlhIzNEJYGW3T4Y5d8o=","MIIDazCCAlOgAwIBAgIIMdQl7kIMrv0wDQYJKoZIhvcNAQELBQAwWTETMBEGCgmSJomT8ixkARkWA2NvbTEWMBQGCgmSJomT8ixkARkWBm9yYWNsZTEVMBMGCgmSJomT8ixkARkWBWNsb3VkMRMwEQYDVQQDEwpDbG91ZDlDQS0yMCAXDTE2MDUyMTAyMTgwOVoYDzIxMTYwNDI3MDIxODA5WjBZMRMwEQYKCZImiZPyLGQBGRYDY29tMRYwFAYKCZImiZPyLGQBGRYGb3JhY2xlMRUwEwYKCZImiZPyLGQBGRYFY2xvdWQxEzARBgNVBAMTCkNsb3VkOUNBLTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPZn2VAoMsIfWmIJks9exzK+DXaX6qYyBc12dRqDrRpC48v3CBeBchV/GT2E+mjcDp8Hzq8oIpwr9W5kwMja4PU3SPd4/0LB6WKbtLfHOnJxLg9EaT992UpbUGHaHlEq4oRAuVvPgDLp5sSspLZYEBKUh4vJXOyLitE1qsXn7mJNXRKTJZvrJKdfbs1dyTge3V3wk1rwY/wCWMKVgkqCgSzzWCGju8EZWoOrnzlR6BHkA0qZqeV4F7jDW8ucdv+Y20pOlOiaEbIg/ZFYGrZd5VWjlNvgLfU8P4C/YJLSkkcPHgoet3w4jI0S26efu59rVzgU9VsKnKtnqbDL99t81vAgMBAAGjNTAzMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFDMA8e55FI5kC12+guIE9xtcIXpFMA0GCSqGSIb3DQEBCwUAA4IBAQC45tOVeqHxA8Bo/Rnv1SHHpULge3HyTC1XV9nmUdrj6g/U6rmbA5hVJ5LshgQ77qopO/YsaNHj5Ru1u/+8VOlZWpbn+kt3CDOuBUCe89CKBZT/KWEDkvtNl2qu16gOkhFnuTQk8NsARvwZZ6KtyPDmsbW4Nc/I5fKwPhdTaMjCV6Lh9RCG4kU77lbdwY3SaXlCBXXQyfPWMouCi7z1thJaF3cNGW4tnsibMR5ej9fJ9j6UvShxNgAIgjNDoihPlC6k0kW3QDR3bBjCHJX47505aIhckojH/eKsP2Or0eE/Ma4WNbndj0IXPE2ae5AVmC8/GRtwAmnoZPnt3g/I2m5j"],"use" : "sig","alg":"RS256","n":"khfJqiO57xMlci4mtvirEGoDfPflsLWQd3G0ZkQQlQK2QcraQRQPkaoP8Lo6KMKA-1mV1TxGfd9QMx9ONmtRL8RIWvt0543Fae6wPfRpaeIcDpknsHAovsTdQ9SwfqwhF7slDg4ciEJ7-gdpCJKMVQcnsiWBDPCoIC1xzB7KbGKrWvaPAmxx1hoM4etjPwBy8h_JvHMfDEF1GkrUtCDiLFPyGBLPv50hmyN6mnTu47lBhzIwzeZ4HqZLgrOdqdA6iSZrBxRzHDi1IWqoj87FYpztkWXnV7VkIN37RwrG6bFKOHGaYEydoF0LmI4pltssTxsdtLyN-Hr8fM402cs7Iw"}
-
任务 2:配置 OCI 函数以调用 OCI SDK API
-
了解 OCI 函数和 API 网关:通过 API 网关公开服务是最佳做法。许多验证可以绕过从 API 网关到后端服务的身份证明,但如果后端验证不是客户端应用程序的合适方法,我们可以在 API 网关级别执行一些配置。
在此步骤中,让我们了解 OCI API Gateway 如何帮助我们集成 OAuth2 验证和任何 OCI 服务的请求,例如通过 OCI Functions 预测数据科学模型部署。
OCI Functions 可以执行任务来接收正文请求并传递到 OCI 服务。OCI 服务中的某些服务无法通过 OAuth2 方法进行验证,因此我们可以使用 OCI Functions 进行验证。
在此示例中,模型部署预测服务可以通过 OCI IAM 中的 OCI 私有密钥进行验证。这可以通过资源主体来完成。
如果您不知道如何创建和部署 OCI 函数,请参阅 OCI 函数快速入门
-
了解代码:此代码将准备用于 OCI API Gateway 。在您的 API 部署中,我们将在 API 网关中配置模型部署端点,并将其作为 HEADER 参数传递。因此,您可以将此功能用于所需的每个 API 网关部署中的许多模型部署。
-
我们将使用 Python 中的
oracle.ads
库授权资源主用户访问模型部署实例(请参见任务 4)。ads.set_auth('resource_principal')
-
正文内容可由此行捕获。
body = json.loads(data.getvalue())
-
我们将在 OCI API Gateway 中配置名为 model_deployment 的 HEADER。此 HEADER 包含在 API 网关请求中传递的模型部署预测的 URL。
endpoint = ctx.Headers()["model_deployment"]
-
这将执行 REST API POST 请求,并从数据科学端点中的模型部署返回结果。
return requests.post(endpoint, json=body, auth=ads.common.auth.default_signer()['signer']).json()
-
这是需要在此函数中装入的
requirements.txt
库。requirements.txt --------------------- fdk>=0.1.54 requests oracle-ads
部署 OCI Functions,然后在 OCI API Gateway 中进行配置。
-
任务 3:配置 API 网关部署验证
注:有关如何开发 OCI 函数并在 OCI API 网关中调用它的更多信息,请参阅使用 API 网关调用 OCI 函数。
-
选择 OAuth 2.0 / OpenID Connect 并输入以下配置。这是通过 HEADER 进行验证的默认方式。
Token Location: Header JWT token header name: Authorization Authentication scheme: Bearer
-
输入以前创建的 JSON Web 密钥字符串,选择静态密钥,然后输入以下信息。
Key ID: SIGNING_KEY Key format: JSON web key JSON web key: <Your JWK string created previously>
-
使用先前获取的 OCI API Gateway hostname 以
https://identity.oraclecloud.com/
身份输入发布者和受众。配置在上一个任务中创建的 OCI 函数。
-
配置 HEADER
model_deployment
参数,单击显示路由请求策略。 -
在 HEADER 转换中,单击添加。
-
您必须具有数据科学模型部署预测 URL,您可以在此处获取此 URL:转至数据科学菜单,选择数据科学实例和模型部署,然后单击调用您的模型。
注:在此处保存模型部署 OCID。稍后需要配置策略。
您的数据科学模型部署预测 URL。
-
输入标头名称作为 model_deployment ,输入值作为数据科学模型部署预测 URL。
注:保存 API 网关部署后,请记住 API 部署端点。
任务 4:配置 OCI 组和策略
创建动态组以将 OCI 函数的访问权限授予您的 OCI 资源。在本教程中,我们将使用数据科学模型部署。有关如何使用资源主体的更多信息,请参见资源主用户。
-
获取模型部署实例的 OCID 。在动态组字符串中输入 OCID。
ALL {resource.type = 'fnfunc', resource.id = 'ocid1.datasciencemodeldeployment.oc1.sa-saopaulo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}
注:
resource.id
是以前在“模型部署”控制台屏幕中获取的 OCID。 -
创建策略以允许动态组。有关详细信息,请参阅模型部署策略。
allow dynamic-group hoshikawa_datascience to {DATA_SCIENCE_MODEL_DEPLOYMENT_PREDICT} in tenancy allow dynamic-group hoshikawa_datascience to manage data-science-model-deployments in tenancy
任务 5:测试 API
现在,让我们在 OCI 数据科学中模拟应用对模型部署服务的 OAuth2 请求。
-
获取将客户端 ID 和客户端密钥传递给 Oracle Identity Cloud Service 提供程序的令牌。
-
输入 OCI API Gateway 部署端点并选择
POST
REST 请求。复制 access_token 值并传递到 OCI API Gateway 部署。请记住,令牌的持续时间为一小时。这就是结果!
相关链接
确认
- 作者 - Cristiano Hoshikawa(Oracle LAD A 团队解决方案工程师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Enable OAuth2 Authentication in OCI API Gateway to Call OCI Services using OCI Functions and OCI SDK
F90853-01
December 2023
Copyright © 2023, Oracle and/or its affiliates.