注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
使用 OCI API 网关和 OCI 函数定制 API 安全性
简介
了解 Oracle Cloud Infrastructure (OCI) Functions 与 OCI API Gateway 之间如何实现无缝协同,为 API 实施自定义身份验证方法,以及函数如何从 API 网关检索参数。
OCI API 网关
通过 OCI API 网关服务,您可以发布具有可从网络中访问的专用端点的 API,如果您希望它们接受互联网流量,则可以使用公共 IP 地址公开这些 API。这些端点支持 API 验证、请求和响应转换、CORS、验证和授权以及请求限制。
使用 OCI API 网关服务,您可以在区域子网中创建一个或多个 API 网关,以处理来自 API 客户端的流量并将其路由到后端服务。可以使用单个 API 网关将多个后端服务(例如 OCI 负载平衡器、OCI 计算实例和 OCI 函数)链接到单个合并 API 端点。
OCI 函数
OCI Functions 是一个完全托管的多租户、高度可扩展的按需函数即服务平台。它基于企业级 OCI,由 Fn Project 开源引擎提供支持。当您需要专注于编写代码以满足业务需求时,请使用 OCI Functions。
注:
本教程仅为教育和学习目的而设计。它为学习者提供了一个在受控环境中进行实验和获得实践经验的环境。需要注意的是,此实验室采用的安全配置和做法可能不适合实际情况。
现实应用的安全注意事项往往更加复杂和动态。因此,在实施生产环境中演示的任何技术或配置之前,必须进行全面的安全评估和审查。本审查应涵盖安全的所有方面,包括访问控制、加密、监视和合规性,以确保系统符合组织的安全政策和标准。
从实验室环境过渡到实际部署时,安全性始终是重中之重。
目标
- 使用 OCI Functions 作为授权方函数创建具有模拟响应的 API 网关,以实施定制安全验证,将特定参数返回到 API 网关。
先决条件
-
具有管理员权限的 Oracle 账户。
-
在您的用户中创建验证令牌。有关更多信息,请参见 Generating an Auth Token to Enable Login to Oracle Cloud Infrastructure Registry 。
-
用于创建资源的区间。
注:请记下区间名称和区间 ID 。
-
具有专用子网和公共子网的 VCN。有关详细信息,请参阅创建虚拟云网络。
-
部署在 VCN 专用子网中的函数应用程序。有关更多信息,请参见 Functions QuickStart Guides 。
-
在 VCN 的公共子网中创建的 API 网关。有关更多信息,请参见 API Gateway QuickStart Guide 。
-
我们将使用虚拟后端(在 API 网关中称为库存响应)。有关更多信息,请参阅将库存回应添加为 API 网关后端。
-
使用浏览器访问 OCI Cloud Shell。有关详细信息,请参阅 OCI Cloud Shell 。
-
配置安全列表以允许在专用子网和公共子网之间进行访问。
任务 1:设置动态组
登录到 OCI 控制台,导航到您的域,单击动态组并使用以下信息创建组。
-
组名:输入
MyFunctions
。ALL {resource.type = 'fnfunc', resource.compartment.id = 'pasteYourCompartmentOCID'}
-
组名:输入
MyApiGateway
。ALL {resource.type = 'ApiGateway', resource.compartment.id = 'pasteYourCompartmentOCID'}
任务 2: 创建策略
转到 OCI 控制台,导航到策略并使用以下信息创建策略。
-
策略名称:输入
FunctionsPolicies
。Allow dynamic-group MyFunctions to read repos in compartment YOUR-COMPARTMENT-NAME
-
策略名称:输入
ApiGatewayPolicies
。Allow dynamic-group MyApiGateway to use functions-family in compartment YOUR-COMPARTMENT-NAME
任务 3:创建 OCI 容器注册表
-
转到 OCI 控制台,导航到开发人员服务、容器和对象,选择容器注册表,然后单击创建资料档案库为函数映像创建专用资料档案库。
-
资料档案库名称:输入
functions/authorizationfunctionjava
。
-
-
检查系统信息库并记下 Namespace 。
-
打开应在其中安装 OCI CLI 和 Docker 的 OCI Cloud Shell,然后继续登录注册表。检查您所在地区的正确 URL。在本教程中,我们使用 Brazil East (Sao Paulo) ,其中注册表 URL 为
gru.ocir.io
。docker login -u 'yourRepositoryNamespace/oracleidentitycloudservice/yourUserLogin' gru.ocir.io Password: YOUR_AUTH_TOKEN_CREATED_EARLIER
任务 4:创建 Java OCI 函数作为授权方函数
注:请确保选择专用子网。
-
转到 OCI 控制台,导航到 Developer Services(开发人员服务)、 Functions(函数)、 Applications(应用程序)并单击 Create application(创建应用程序)。
-
在安装了 Docker、OCI CLI 和 Fn Project CLI 的位置启动 OCI Cloud Shell,然后运行以下命令来初始化函数。
注:如果执行了任务,则 Docker 登录命令应该已经执行,如果尚未执行,请继续执行任务 3 中的 Docker 登录步骤。
转到 OCI 控制台,导航到开发人员服务、函数、应用程序,选择您的应用程序,然后单击入门。运行以下命令。
fn list context fn use context sa-saopaulo-1 fn update context oracle.compartment-id PASTE_YOUR_COMPARTMENT_OCID fn update context registry gru.ocir.io/PASTE_YOUR_REGISTRY_NAMESPACE/functions
注:在本教程中,我们使用的是 Brazil East(Sao Paulo) 区域,如果您使用的是其他区域,则需要更改注册表位置。
-
从此处下载 Java 函数示例代码:authorizationfunctionjava.tar ,然后将其上载到 OCI Cloud Shell,然后继续解压缩文件。
# check your file is there ls -lrt # create your directory mkdir authorizationfunctionjava # unzip the file tar -xvf authorizationfunctionjava.tar -C authorizationfunctionjava cd authorizationfunctionjava/
这个简单的 Java 代码接收两个参数
token
和customer
。它还从函数配置中定义的系统环境变量中检索第三个参数。注:请确保 handleRequest(Input input) 方法中的参数名称与 API 网关配置中使用的名称相同。这可确保 API 网关将参数正确传递给授权方函数。
此代码片段验证输入并返回特定响应。
有关所需响应格式和参数的更多信息,请参阅创建授权方函数。
-
运行以下命令以构建代码并部署函数。
cd authorizationfunctionjava/ ls -lart fn deploy --app chafikFunctions
-
创建多个配置来存储客户凭据,以测试函数验证。
注:这些配置变量用作本教程中提供的 Java 示例代码中的系统环境变量。但是,您可以修改函数代码以使用替代方法,例如 Fn RuntimeContext 。有关更多信息,请参见 Using the Fn RuntimeContext with Functions 。
密钥名称/密钥 值 FN_AAA_KEY 123456 FN_BBB_KEY 898989 FN_ORACLE_KEY ABCD1234 -
您可以通过 OCI Console 导航到 Developer Services 来配置这些设置。在函数下,单击应用程序,选择您的应用程序,然后选择您的函数。在函数详细信息页中,单击配置。
或者
运行
fn
命令。fn config function --help MANAGEMENT COMMAND fn config function - Store a configuration key for this function USAGE fn [global options] config function <app-name> <function-name> <key> <value> DESCRIPTION This command sets the configuration of a specific function for an application. fn config function chafikFunctions authorizationfunctionjava FN_ORACLE_KEY ABCD1234
-
运行以下命令以调用函数。
# Invoke the function to check if it's working as expected echo -n '{"data" : {"customer":"ORACLE", "token": "ABCD1234"}}' | fn invoke chafikFunctions authorizationfunctionjava
注:初始调用最多可能需要一分钟来预热函数。查看配置以了解任何其他设置。有关更多信息,请参见 Reducing Initial Latency Using Provisioned Concurrency 。
使用有效数据和无效数据进行测试,以验证函数响应。
任务 5:创建 OCI API 网关和模拟 API 以使用授权方函数
注:请确保选择公共子网。
-
转到 OCI 控制台,导航到 Developer Services(开发人员服务)、 API Management(API 管理)、 Gateways(网关),然后单击 Create Gateway(创建网关)。
-
转到网关详细信息页面,并向下记下主机名。
-
在 API 网关中创建部署。在基本信息中,输入以下信息。
- 路径前缀:输入
/authFunction
。
注意:来自 API 网关的主机名和路径前缀将用于构成 API 端点。
- 路径前缀:输入
-
在验证中,输入以下信息。
-
选择 Single Authentication(单验证)。
-
选择 Authorizer 函数。
-
Oracle Functions 应用程序:选择在任务 4 中创建的应用程序。
-
Oracle 函数:选择在任务 4 中创建的函数。
-
选择 Multi-argument Authorizer function(多参数授权方函数)。
-
函数参数:输入以下信息。
上下文表 标题名称 参数名 request.headers 客户 客户 request.headers token token
注意标头名称是指调用 API 端点时请求标头中包含的信息。参数名称是发送到授权方函数的参数名称,请参阅任务 4.3 中的 Java 代码
-
-
在路由中,使用以下信息为模拟测试创建单个路由。
- 路径:输入
/mock
。 - 方法:选择 GET 。
- 后端选项:选择编辑添加的单个后端。
- 后端类型:选择库存回应。
- 路径:输入
-
在路由中,定义模拟响应并单击下一步。
- 状态代码:输入 200 。
- 正文:输入 {"mensagem" :"ok"} 。
- 标题名称:选择内容类型。
- 标头值:选择 application/json;charset=UTF-8 。
-
在复查中,验证配置并单击保存更改以完成部署创建。
-
运行
curl
命令以测试 API。# Invoke using <Verb Defined in Route> with the endpoint like: <API Gateway Hostname> + <Deployment Path Prefix> + <Route Path> # Send parameters, such as customer and token, in the Header with values configured in Task 4 - Step 5 curl -i -H "customer: AAA" -H "token: 123456" -X GET https://yourapigatewayhosta.your-region.oci.customer-oci.com/authFunction/mock
如果使用无效信息进行调用,则响应将为 HTTP/1.1 401 Unauthorized 。
任务 6:使用 OCI API 网关从授权方函数中检索参数和范围
注意请参阅任务 4 中下载的 Java 代码。此任务说明如何在 API 网关中使用
result.context
和result.scope
。
-
从授权者函数中检索上下文值。
考虑需要从授权方函数中检索信息并在 API 网关中使用该信息的方案。例如,您可能希望使用授权令牌来调用后端服务。
注意:在此实验室演示中,信息将返回到响应标题中。
-
转到 OCI 控制台,导航到 Developer Services(开发人员服务)、 API Management(API 管理)、 Gateways(网关),然后选择您的网关。单击部署,选择在任务 5 中创建的部署,然后单击编辑。
-
导航到路由,然后单击显示路由响应策略。
-
在响应策略的标头转换下,单击添加以继续。
-
在响应标头转换页中,按下图中所示配置 API 网关,然后单击应用更改。
Java 代码中的两个参数都将包含在 API 响应标头中。
- 标头名称:此字段指定 API 响应中标头属性的名称。
- 值:此字段指定从授权方函数检索的属性的名称。
使用以下格式:
${request.auth[attributeNameFromAuthorizerFunction]} #examples ${request.auth[valor01]} ${request.auth[valor02]}
-
复核题头回应设置。单击下一步以复核更改,然后单击保存更改以应用。
-
测试 API 并检查响应标头。
-
让我们说明如何使用授权方函数中的范围值来增强安全性。
注:在授权上下文中,范围是指授予用户或应用程序的特定权限或访问级别。
授权方函数返回此 API 调用的所有可用范围(在我们的示例中为硬编码)。
对于 API 网关部署中的某些路由,您可能希望仅允许特定范围来增强安全性。
转到 OCI 控制台,导航到 Developer Services(开发人员服务)、 API Management(API 管理)、 Gateways(网关),然后选择您的网关。单击部署,选择在任务 5 中创建的部署,然后单击编辑。
-
导航到路由,然后单击显示路由请求策略。
-
在请求策略的授权下,单击编辑。
-
在授权策略中,选择任何作为授权类型,添加授权者函数返回的所有允许的范围,然后单击应用更改。
-
在复查中,复查所做的更改,单击下一步,然后单击保存更改以应用所做的修改。
-
测试 API 并验证它是否正常工作。范围由授权者函数返回。
-
将 API 网关更改为使用授权方函数未返回的范围。
复查所做的更改,单击下一步,然后单击保存更改以应用所做的修改。
-
测试 API 并验证结果。
响应将处于 404 Not Found http 状态。
在返回两个标头时,检查授权者功能是否正常工作。但是,由于请求策略中的范围授权验证,路由后端失败。
相关链接
确认
-
作者 — Rodrigo Chafik Choueiri(Oracle LAD A-Team 解决方案工程师)
-
贡献者 — Joao Tarla(Oracle LAD A-Team 解决方案工程师),Sillas Lima(Oracle LAD 解决方案架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Customize your API Security using OCI API Gateway and OCI Functions
G25986-01
February 2025
Copyright ©2025, Oracle and/or its affiliates.