注意:

使用 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。

注:

目标

先决条件

任务 1:设置动态组

登录到 OCI 控制台,导航到您的域,单击动态组并使用以下信息创建组。

任务 2: 创建策略

转到 OCI 控制台,导航到策略并使用以下信息创建策略。

任务 3:创建 OCI 容器注册表

  1. 转到 OCI 控制台,导航到开发人员服务容器和对象,选择容器注册表,然后单击创建资料档案库为函数映像创建专用资料档案库。

    • 资料档案库名称:输入 functions/authorizationfunctionjava

      创建资料档案库

  2. 检查系统信息库并记下 Namespace

    资料档案库名称空间

  3. 打开应在其中安装 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
    

    docker 登录

任务 4:创建 Java OCI 函数作为授权方函数

注:请确保选择专用子网。

  1. 转到 OCI 控制台,导航到 Developer Services(开发人员服务)Functions(函数)Applications(应用程序)并单击 Create application(创建应用程序)

    创建应用程序

  2. 在安装了 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) 区域,如果您使用的是其他区域,则需要更改注册表位置。

  3. 从此处下载 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/
    

    解压缩 tar 文件

    这个简单的 Java 代码接收两个参数 tokencustomer。它还从函数配置中定义的系统环境变量中检索第三个参数。

    注:请确保 handleRequest(Input input) 方法中的参数名称与 API 网关配置中使用的名称相同。这可确保 API 网关将参数正确传递给授权方函数。

    java 代码

    此代码片段验证输入并返回特定响应。

    validation

    结果

    有关所需响应格式和参数的更多信息,请参阅创建授权方函数

  4. 运行以下命令以构建代码并部署函数。

    cd authorizationfunctionjava/
    ls -lart
    fn deploy --app chafikFunctions
    

    构建

    构建

  5. 创建多个配置来存储客户凭据,以测试函数验证。

    注:这些配置变量用作本教程中提供的 Java 示例代码中的系统环境变量。但是,您可以修改函数代码以使用替代方法,例如 Fn RuntimeContext 。有关更多信息,请参见 Using the Fn RuntimeContext with Functions

    密钥名称/密钥
    FN_AAA_KEY 123456
    FN_BBB_KEY 898989
    FN_ORACLE_KEY ABCD1234
  6. 您可以通过 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
    
  7. 运行以下命令以调用函数。

    # 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 以使用授权方函数

注:请确保选择公共子网。

  1. 转到 OCI 控制台,导航到 Developer Services(开发人员服务)API Management(API 管理)Gateways(网关),然后单击 Create Gateway(创建网关)

    创建应用程序

  2. 转到网关详细信息页面,并向下记下主机名

    网关主机名

  3. 在 API 网关中创建部署。在基本信息中,输入以下信息。

    • 路径前缀:输入 /authFunction

    注意:来自 API 网关的主机名路径前缀将用于构成 API 端点。

    基本信息

  4. 验证中,输入以下信息。

    • 选择 Single Authentication(单验证)

    • 选择 Authorizer 函数

    • Oracle Functions 应用程序:选择在任务 4 中创建的应用程序。

    • Oracle 函数:选择在任务 4 中创建的函数。

    • 选择 Multi-argument Authorizer function(多参数授权方函数)

    • 函数参数:输入以下信息。

      上下文表 标题名称 参数名
      request.headers 客户 客户
      request.headers token token

    注意标头名称是指调用 API 端点时请求标头中包含的信息。参数名称是发送到授权方函数的参数名称,请参阅任务 4.3 中的 Java 代码

    单一验证

    函数参数

  5. 路由中,使用以下信息为模拟测试创建单个路由。

    • 路径:输入 /mock
    • 方法:选择 GET
    • 后端选项:选择编辑添加的单个后端
    • 后端类型:选择库存回应

    马路

  6. 路由中,定义模拟响应并单击下一步

    • 状态代码:输入 200
    • 正文:输入 {"mensagem" :"ok"}
    • 标题名称:选择内容类型
    • 标头值:选择 application/json;charset=UTF-8

    模拟

  7. 复查中,验证配置并单击保存更改以完成部署创建。

  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

    401 状态

任务 6:使用 OCI API 网关从授权方函数中检索参数和范围

注意请参阅任务 4 中下载的 Java 代码。此任务说明如何在 API 网关中使用 result.contextresult.scope

  1. 从授权者函数中检索上下文值。

    context 变量

    考虑需要从授权方函数中检索信息并在 API 网关中使用该信息的方案。例如,您可能希望使用授权令牌来调用后端服务。

    注意:在此实验室演示中,信息将返回到响应标题中。

  2. 转到 OCI 控制台,导航到 Developer Services(开发人员服务)API Management(API 管理)Gateways(网关),然后选择您的网关。单击部署,选择在任务 5 中创建的部署,然后单击编辑

    编辑部署

  3. 导航到路由,然后单击显示路由响应策略

    路由响应

  4. 响应策略标头转换下,单击添加以继续。

    添加按钮

  5. 响应标头转换页中,按下图中所示配置 API 网关,然后单击应用更改

    Java 代码中的两个参数都将包含在 API 响应标头中。

    • 标头名称:此字段指定 API 响应中标头属性的名称。
    • 值:此字段指定从授权方函数检索的属性的名称。

    使用以下格式:

    ${request.auth[attributeNameFromAuthorizerFunction]}
    
    #examples
    ${request.auth[valor01]}
    ${request.auth[valor02]}
    

    题头设置

  6. 复核题头回应设置。单击下一步以复核更改,然后单击保存更改以应用。

    检查标题设置

  7. 测试 API 并检查响应标头。

    标头响应

  8. 让我们说明如何使用授权方函数中的范围值来增强安全性。

    注:在授权上下文中,范围是指授予用户或应用程序的特定权限或访问级别。

    context 变量

    授权方函数返回此 API 调用的所有可用范围(在我们的示例中为硬编码)。

    对于 API 网关部署中的某些路由,您可能希望仅允许特定范围来增强安全性。

    转到 OCI 控制台,导航到 Developer Services(开发人员服务)API Management(API 管理)Gateways(网关),然后选择您的网关。单击部署,选择在任务 5 中创建的部署,然后单击编辑

    编辑部署

  9. 导航到路由,然后单击显示路由请求策略

    路由请求

  10. 请求策略授权下,单击编辑

    编辑按钮

  11. 授权策略中,选择任何作为授权类型,添加授权者函数返回的所有允许的范围,然后单击应用更改

    授权策略

  12. 复查中,复查所做的更改,单击下一步,然后单击保存更改以应用所做的修改。

    授权策略

  13. 测试 API 并验证它是否正常工作。范围由授权者函数返回。

    测试成功

  14. 将 API 网关更改为使用授权方函数未返回的范围。

    复查所做的更改,单击下一步,然后单击保存更改以应用所做的修改。

    作用域失败

  15. 测试 API 并验证结果。

    授权策略

    响应将处于 404 Not Found http 状态。

    在返回两个标头时,检查授权者功能是否正常工作。但是,由于请求策略中的范围授权验证,路由后端失败。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心