在开发者门户中提供 API

Red Hat 3scale 2-saas

正确配置了开发人员门户,为 API 管理提供了强大的功能。

Red Hat Customer Content Services

摘要

本指南记录了在红帽 3scale 2-saas 上使用开发人员门户。

前言

定义您的 API 的 OpenAPI 文档是开发人员门户的基础。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。这些更改将在即将发行的几个发行本中逐渐实施。详情请查看我们的 CTO Chris Wright 信息

部分 I. OpenAPI 规格

第 1 章 OpenAPI 规格简介

在 Red Hat 3scale API Management 中,OpenAPI 规格(OAS)可帮助您优化管理 OpenAPI 文档。OpenAPI 规格(OAS)为您提供更新现有服务或创建新服务的工具。

以下是 3scale 中 OAS 的特殊注意事项:

先决条件

  • 定义 API 的 OpenAPI 文档。
  • 3scale 2-saas 实例租户的凭据(tokenprovider_key)。

使用 OAS 时,3scale 中提供了以下功能:

注意

当您导入 OpenAPI 文档时,您可以创建或更新 ActiveDocs。请参阅 如何编写 OpenAPI 文档以用作 3scale 规格

  • 将 3scale 服务 system_name 作为参数传递,该参数默认为 OAS 中的 info.title 字段。
  • 为 OpenAPI 规格中定义的每个操作创建方法。

    • Method 名称取自 operation.operationId 字段。
  • 在导入新的 API 定义前,所有现有的映射规则都会被删除。

    • 如果方法在运行命令之前存在,则不会删除它们。
  • 映射为 OpenAPI 规格中定义的每个操作创建规则。
  • 以下频道之一提供 OpenAPI 定义资源:

    • 可用路径中的文件名
    • URL 格式 - toolbox 将尝试从指定地址下载。
    • stdin 标准输入流读取.

1.1. 在 3scale 中导入 OpenAPI 文档的命令行选项

3scale 命令行界面(CLI)提供了一些选项来导入 OpenAPI 文档,用于定义要在 3scale 中管理的 API。以下是 openapi 选项的帮助信息:

NAME
    openapi - Import API definition in OpenAPI specification

USAGE
    3scale import openapi [opts] -d <dst> <spec>

DESCRIPTION
    Using an API definition format like OpenAPI, import to your 3scale API

OPTIONS
       -d --destination=<value>                   3scale target instance.
                                                  Format: "http[s]://<authentication>@3scale_domain"

 -t --target_system_name=<value>            Target system name

OPTIONS FOR IMPORT
    -c --config-file=<value>                      3scale toolbox
                                                  configuration file
                                                  (default:
                                                  $HOME/.3scalerc.yaml)
    -h --help                                     show help for this command
    -k --insecure                                 Proceed and operate even
                                                  for server connections
                                                  otherwise considered
                                                  insecure
    -v --version                                  Prints the version of this
                                                  command

1.2. 导入 API 规格的不同源

作为 3scale 管理员可用于导入 API 规格,您可以获得不同的源。它们在下表中概述,它显示了从文件名路径、URL 和 stdin 中检测 OpenAPI 定义的使用情况选项。

表 1.1. 检测 OpenAPI 定义

描述格式命令行

从文件名路径检测 OpenAPI 定义。格式会根据文件名扩展来决定。

jsonyaml

$ 3scale import openapi -d <destination> /path/to/your/spec/file.[json|yaml|yml]

从 URL 检测 OpenAPI 定义。格式会根据 URL 的路径扩展来决定。

jsonyaml

$ 3scale import openapi -d <destination> http[s]://domain/resource/path.[json|yaml|yml]

stdin 检测 OpenAPI 定义。OpenAPI 资源的命令行参数是 -。使用解析器在内部检测到格式。

jsonyaml

$ tool_to_read_openapi_from_source | 3scale import openapi -d <destination> -

第 2 章 如何配置 OpenAPI 规格

要使 OpenAPI 规格与 3scale 一同使用,需要根据您要使用的版本进行正确配置。

先决条件

  • 定义 API 的 OpenAPI 文档。
  • 3scale 2-saas 实例租户的凭据(tokenprovider_key)。

2.1. 3scale 的 OpenAPI 规格 3.0 使用

3scale 提供以下对使用 OAS 3.0 的支持:

  • 在开发者门户中更新了 swagger-ui,以支持 OAS 3.0
  • swagger-ui 现在包含一个 webpack asset(node_modules)。以前,它从 Content Delivery Networks(CDN)添加。
  • 在管理门户中,任何新的 OAS 3.0 文档都会使用 swagger-ui 提供的功能自动处理并进行相应处理。请注意,这个功能需要在 Developer Portal 中进行配置。

您可以将 OAS 3.0 规格添加到 ActiveDocs 中,并在开发者门户中显示它们,请考虑以下点:

  • 您必须手动升级模板。
  • ActiveDoc 在尝试请求时没有额外的功能,如凭证注入,使用诸如服务名称等实际数据的自动完成功能。

2.1.1. 使用 OAS 3.0 配置开发人员门户

此片段包括新版本的 swagger-ui,并呈现第一个可用的 ActiveDoc。请注意,它还呈现 OAS 2.0,但没有任何常见的 ActiveDocs 功能。

对 OAS 3.0 规格的支持需要默认文档页面中的以下内容:

{% content_for javascripts %}
 {{ 'active_docs.js' | javascript_include_tag }}
{% endcontent_for %}

{% assign spec = provider.api_specs.first %}

<h1>Documentation</h1>

<div class="swagger-section">
 <div id="message-bar" class="swagger-ui-wrap"></div>
 <div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</div>

<script type="text/javascript">
 (function () {
   var url = "{{spec.url}}";
   var serviceEndpoint = "{{spec.api_product_production_public_base_url}}"
   SwaggerUI({ url: url, dom_id: "#swagger-ui-container" }, serviceEndpoint);
 }());
</script>

使用 OAS 3.0 更新开发人员门户

如果您在 3scale 2.8 中配置了 OAS 3.0,并希望继续使用 OAS 3.0,则需要更新该模板。

这是要配置的模板:

{% content_for javascripts %}
    {{ 'active_docs.js' | javascript_include_tag }}
{% endcontent_for %}

<h1>Documentation</h1>

<div class="swagger-section">
  <div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
  <div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</div>

<script type="text/javascript">
  (function () {
    var url = "{{provider.api_specs.first.url}}";

    SwaggerUI({ url: url, dom_id: "#swagger-ui-container" });
  }());
</script>

要更新模板,请将默认的 Documentation 页面替换为 第 2.1.1 节 “使用 OAS 3.0 配置开发人员门户” 中包含的代码片段。

2.2. 3scale 的 OpenAPI 规格 2.0 使用

您可以将 OAS 2.0 规格添加到 ActiveDocs 中,并在 Developer Portal 中显示它们,请考虑以下点:

  • 您必须手动升级模板。
  • ActiveDoc 在尝试请求时没有额外的功能,如凭证注入,使用诸如服务名称等实际数据的自动完成功能。

对 OAS 2.0 规格的支持需要默认文档页面中的以下内容:

<h1>Documentation</h1>
{% cdn_asset /swagger-ui/2.2.10/swagger-ui.js %}
{% cdn_asset /swagger-ui/2.2.10/swagger-ui.css %}

{% include 'shared/swagger_ui' %}

<script type="text/javascript">
  $(function () {
    window.swaggerUi.options['url'] = "{{provider.api_specs.first.url}}";
    window.swaggerUi.load();
  });
</script>

2.3. 将 Swagger 用户界面 2.1.3 升级到 2.2.10

如果您使用包含 Swagger UI 2.1.3 的 3scale 版本,您可以升级到 Swagger UI 2.2.10。

以前在 3scale 开发人员门户中实现的 Swagger UI 2.1.3 需要在 Documentation 页中存在一个 {% active_docs version: "2.0" %} liquid 标签。随着 3scale 中对 Swagger 2.2.10 的支持,实施方法会更改为多个 cdn_assetinclude liquid 标签。

注意

对于 Swagger UI 2.1.3 及更早版本的版本,3scale 继续使用旧的 active_docs liquid 标签方法来调用 UI。

先决条件

  • 具有管理员访问权限的 3scale 实例。
  • 包含 Swagger UI 2.1.3 的 3scale 实例。

流程

  1. 登录您的 3scale 管理门户。
  2. 导航到 Developer PortalDocumentation 页面,或您要更新 Swagger UI 的页面
  3. 在代码窗格的 Draft 选项卡中,将 {% active_docs version: "2.0" %} liquid 标签替换为 cdn_asset liquid 标签和新的 shared/swagger_ui 部分:

    {% cdn_asset /swagger-ui/2.2.10/swagger-ui.js %}
    {% cdn_asset /swagger-ui/2.2.10/swagger-ui.css %}
    
    {% include 'shared/swagger_ui' %}
  4. 可选:默认情况下,Swagger UI 会加载 APIs > ActiveDocs 中发布的 ActiveDocs 规格。通过在 window.swaggerUi.load(); 行前添加 window.swaggerUi.options 行来加载不同的规格(其中 <SPEC_SYSTEM_NAME> 是需要加载的规格系统名称):

    window.swaggerUi.options['url'] = "{{provider.api_specs.<SPEC_SYSTEM_NAME>.url}}";

部分 II. Developer Portal 中的 API 文档

第 3 章 更新至 ActiveDocs 2.0

注意

本节的详细信息仅供参考。这个选项不再被支持,您应该考虑在最早的机会中从此配置迁移。

在本教程结束时,您将了解您需要对 ActiveDocs 配置进行哪些更改才能成功升级到 2.0 版本。

有关 ActiveDocs 2.0 配置的说明,请参阅 向 3scale 添加规格。有关规格的详细差异可在官方 Swagger 1.2 到 2.0 迁移指南 中找到。本文介绍了升级到 ActiveDocs 2.0 的额外步骤。

注意

如果您的 ActiveDocs spec 仍然在版本 1.0 中,请首先将其转换为版本 1.2。

3.1. 第 1 步:为您的规格应用适当的命名约定

导航到管理门户中的 API → ActiveDocs 选项卡。这将导致您进入您的服务规格列表。您应该已经添加了服务规格(请参阅 创建服务规格)。

命名您的规格

您应该在 Developer Portal 中应用适当的名称来实现所需的效果 - ActiveDocs API 列表的标题将显示为 "System name: Description"。您可能需要通过复制 JSON spec 和其他字段再次重新创建 spec,因为系统名称是只读的。

3.2. 第 2 步:修改服务规格

与版本 1.2 相比,ActiveDocs 2.0 的规格对版本有一些重要更改。有关详细信息,请参阅 Swagger 1.2 到 2.0 迁移指南。最重要的更改是:

  • "swaggerVersion": "1.2" root 元素现在是 "swagger": "2.0",它是必填字段。
  • 需要 "info" 对象。
  • 需要 "apiVersion": "1.0",现在是 "info" 对象的一部分: "info": { "version": "1.0", …​ }
  • "info"对象中的描述将变为非必需。
  • 如果存在 "license" 对象,则需要 license name 字段。
  • "basePath": "https://example.com/api" 字段被分成三个字段:" host": "example.com" , " basePath": "/api""schemes": [ "http" ]。这些字段都不是必须的。

3.3. 第 3 步:将 Javascript 和 HTML 内容添加到 CMS 页面中

将以下代码片段添加到 CMS 页面中,其中 SERVICE_NAME 应该是服务规格的系统名称。

<h1>Documentation</h1>
<p>Use our live documentation to learn about Echo API </p>
{% active_docs version: "2.0" services: "SERVICE_NAME" %}
<script type="text/javascript">
  $(function () {
    {% comment %}
    // you have access to swaggerUi.options object to customize its behaviour
    // such as setting a different docExpansion mode
    window.swaggerUi.options['docExpansion'] = 'none';
    // or even getting the swagger specification loaded from a different url
    window.swaggerUi.options['url'] = "http://petstore.swagger.io/v2/swagger.json";
    {% endcomment %}
  window.swaggerUi.load();
});

</script>

如果要在一个页面中包含多个 Swagger specs,您可以使用这个自定义片断:

{% active_docs version: "2.0" services: "oauth" %}



<script type="text/javascript">
  $(function () {
    window.swaggerUi.load(); // <-- loads first swagger-ui
     // do second swagger-ui
     var url = "/swagger/spec/sentiment.json";
    window.anotherSwaggerUi = new SwaggerUi({
      url: url,
      dom_id: "another-swagger-ui-container",
      supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
      onComplete: function(swaggerApi, swaggerUi) {
        $('#another-swagger-ui-container pre code').each(function(i, e) {hljs.highlightBlock(e)});
      },
      onFailure: function(data) {
        log("Unable to Load Sentiment-SwaggerUI");
      },
      docExpansion: "list",
      transport: function(httpClient, obj) {
        log("[swagger-ui]>>> custom transport.");
        return ApiDocsProxy.execute(httpClient, obj);
      }
    });
     window.anotherSwaggerUi.load();
   });
</script>

3.4. 第 4 步: 使用 ActiveDocs 1.2 测试您的 API

  • 记得在 CMS 配置页面中启用 Liquid 标签。

    启用 Liquid 标签
  • 最后,在预览模式中,关闭右边边栏来查看 ActiveDocs 2.0。
注意

新样式与较新的 Swagger 规格(2.0)兼容。如果要更改外观和感觉,则必须覆盖样式。由于 Swagger 的 CSS 与 HTML 一起包括,因此您必须定义具有更高特定性或带有 !important 标签的样式。

第 4 章 将 ActiveDocs 添加到 3scale

3scale 提供了一个框架,供您的 API 创建交互式文档。

使用 OpenAPI 规格(OAS),您可以获得 API 的功能文档,这有助于开发人员探索、测试并与 API 集成。

4.1. 在 3scale 中设置 ActiveDocs

您可以在 3scale 用户界面中的 API 中添加 ActiveDocs,以获取一个用于为 API 创建交互式文档的框架。

先决条件

  • 定义 API 的 OpenAPI 文档。
  • 3scale 2-saas 实例租户的凭据(tokenprovider_key)。

流程

  1. 在管理门户中导航至 [your_API_name] → ActiveDocs。3scale 显示您的 API 服务规格列表。这最初为空。

    您可以根据需要添加任意数量的服务规格。通常,每个服务规格对应于您的 API 之一。例如,3scale 具有每个 3scale API 的规格,如服务管理、帐户管理、分析和 Billing。

  2. Create a new spec

    当您添加新服务规格时,提供以下内容:

    • 名称
    • 系统名称。这是从 Developer Portal 中引用服务规格所必需的。
    • 选择是否希望发布规格。如果没有发布,则开发人员门户中不提供新规格。

      注意

      如果您创建但不要发布新的规格,则在选择时,将保留供您的发布。

    • 添加仅用于您的消耗的描述。
    • 添加 API JSON 规范。

      根据 OpenAPI 规格(OAS)建议的规格生成您的 API 规格。在本教程中,我们假定您已拥有符合 API 的有效 OAS 规范。

使用第一个 ActiveDoc

添加第一个 ActiveDoc 后,您可以看到它列在 [your_API_name] → ActiveDocs 中。您可以根据需要编辑它,删除它,或者将其从公共切换到私有。您可以从 API 中分离它,或将其附加到任何其他 API。您可以看到所有 ActiveDocs,无论是否将其附加到 Audience → Developer Portal → ActiveDocs 中的 API 中。

您可以通过点您提供服务规格的名称来预览您的 ActiveDocs 看起来,例如 Pet Store。即使规格尚未发布,您也可以执行此操作。

以下是 ActiveDoc 的意义:

ActiveDocs 新规格视图

第 5 章 如何编写 OpenAPI 文档以用作 3scale OpenAPI 规格

如果您只想阅读代码,则所有示例都位于 OAS Petstore 示例源代码中

3scale ActiveDocs 基于名为 Swagger (来自 Wordnik)的 RESTful Web 服务的规格。这个示例基于 Extended OpenAPI Specification Petstore 示例,并从 OpenAPI Specification 2.0 规格文档中提取所有规格数据。

先决条件

  • 需要您的 REST API 兼容的 OpenAPI 规格(OAS)在开发者门户上打开 ActiveDocs。

OAS 不仅仅是一个规格。它还提供完整的功能框架:

  • 用于以多种语言(NodeJS、Scala 及其他)指定资源的服务器。
  • 一组 HTML/CSS/Javascripts 资产,其中包含规格文件并生成有吸引力的 UI。
  • 一个 OAS codegen 项目,允许从 Swagger 兼容服务器中自动生成客户端库。支持以多种现代语言创建客户端库。

5.1. 设置 3scale ActiveDocs 和 OAS

ActiveDocs 是 OAS 的实例。使用 ActiveDocs 时,您不必运行自己的 OAS 服务器,或处理互动文档的用户界面组件。交互式文档可从您的 3scale Developer Portal 提供并呈现。

3scale 2.8 引入了 OAS 3.0,在 ActiveDocs 中支持有限。这意味着,一些使用 ActiveDocs 的功能(如自动完成)还没有完全集成,因此在创建新帐户时 3scale 默认为 OAS 2.0。有关 OAS 3.0 和 ActiveDocs 的详情,请参考 第 2.1 节 “3scale 的 OpenAPI 规格 3.0 使用”

先决条件

  • 确保 Developer Portal 中使用的模板实现了管理门户中指定的同一 OAS 版本。

流程

  1. 构建符合 OAS 的 API 规格。
  2. 将规格添加到您的管理门户。

结果

API 的交互式文档现已可用。API 使用者可以通过您的开发人员门户向 API 发送请求。

如果您已经有 API 的 OAS 兼容规格,可以在 Developer Portal 中添加它。请参阅 ActiveDocs 配置中的教程

3scale 通过几种方法扩展 OAS,以适应开发者门户互动 API 文档所需的特定功能:

  • 自动填充 API 密钥
  • OAS 代理,允许调用启用了非CORS 的 API

5.2. OpenAPI 文档示例: Petstore API

要从原始源读取规格,请参阅 OpenAPI 规格

在 OAS 网站上,定义了 API 的 OpenAPI 文档的多个示例。如果您想通过示例了解,可以按照 OAS API 团队的 Petstore API 示例进行操作。

Petstore API 是一个极其简单的 API。它被称为学习工具,不适用于生产环境。

Petstore API 方法

Petstore API 由 4 种方法组成:

  • GET /api/pets - 返回系统中的所有片断
  • POST /api/pets - 在存储中创建新的片断
  • GET /api/pets/{id} - 基于单个 ID 返回 pet
  • DELETE /api/pets/{id} - 根据 ID 删除一个片断

Petstore API 与 3scale 集成,因此您必须添加额外的参数进行验证。例如,通过用户密钥身份验证方法,API 使用者必须将 user key 参数放在各个请求的标头中。有关其他验证方法的详情,请参考验证模式

用户密钥参数

user_key: {user_key}

user_key 将由 API 用户在其请求中的 API 发送到您的 API。API 用户将获得 3scale 管理员开发人员门户的密钥。在收到密钥时,3scale 管理员必须使用 Service Management API 对 3scale 执行授权检查。

OpenAPI 规格的更多信息

对于 API 用户,在 cURL 调用中代表的 API 文档类似如下:

curl -X GET "http://example.com/api/pets?tags=TAGS&limit=LIMIT" -H "user_key: {user_key}"
curl -X POST "http://example.com/api/pets" -H "user_key: {user_key}" -d "{ "name": "NAME", "tag": "TAG", "id": ID }"
curl -X GET "http://example.com/api/pets/{id}" -H "user_key: {user_key}"
curl -X DELETE "http://example.com/api/pets/{id}" -H "user_key: {user_key}"

5.3. 其他 OAS 规格信息

如果您希望您的文档类似 OAS Petstore 文档,您必须创建一个与关联 Petstore swagger.json 文件类似的 Swagger-compliant 规格。您可以使用此规格开箱即用来测试 ActiveDocs。但请记住,这不是您的 API。

OAS 依赖于资源声明,它映射到通过 JSON 编码的哈希。使用 Petstore swagger.json 文件作为示例,并了解每个对象。

OAS 对象

这是 API 规格的根文档对象。它列出所有最高级别字段。

警告

主机必须是域,而不是 IP 地址。3scale 将对开发人员门户发出的请求代理到您的主机并呈现结果。为了安全起见,这需要您的 hostbasePath 端点被 3scale 批准。您只能声明您自己的主机。如果您检测到正在代理不属于您的域,3scale 会保留终止您的帐户的权利。这意味着本地主机或任何其他通配符域不起作用。

info 对象

info 对象提供有关 API 的元数据。此内容显示在 ActiveDocs 页面中。

paths 对象

paths 对象保存到单个端点的相对路径。该路径附加到 basePath 以构造完整 URL。由于访问控制列表(ACL)约束,paths 可能为空。

不是对象的参数使用原语数据类型。在 Swagger 中,原始数据类型基于 JSON-Schema Draft 4 支持的类型。还有额外的原语数据类型 文件,但 3scale 仅在 API 端点启用了 CORS 时才使用它。启用 CORS 后,上传不会通过 api-docs 网关,此网关将被拒绝。

目前,OAS 支持以下 dataTypes

  • 带有可能的格式的整数: int32 和 int64。两种格式都是有符号的。
  • 带有可能格式的数字:float 和 double
  • 普通字符串
  • 带有可能格式的字符串:byte、date、date-time、password 和 binary
  • 布尔值

5.4. OAS 设计和编辑工具

以下工具可用于设计和编辑定义 API 的 OpenAPI 规格:

  • 开源 Apicurio Studio 允许您在基于 Web 的应用程序中设计和编辑基于 OpenAPI 的 API。Apicurio Studio 提供设计视图,以便您无需详细了解 OpenAPI 规格。Source 视图可让专家用户直接在 YAML 或 JSON 中进行编辑。如需了解更多详细信息,请参阅 Apicurio Studio 入门

    红帽还提供名为 API Designer 的 Apicurio Studio 的轻量级版本,其包含在 OpenShift 上的 Fuse Online 中。如需了解更多详细信息,请参阅开发和部署 API 提供程序集成

  • 如果您非常熟悉 JSON 表示法,则 JSON 编辑器在线工具非常有用。它为紧凑 JSON 提供压缩格式,并提供 JSON 对象浏览器。
  • Swagger Editor 可让您在浏览器中创建和编辑使用 YAML 编写的 OAS API 规格,并实时预览。您还可以生成有效的 JSON 规格,稍后您可以在 3scale 管理门户中进行上传。您可以使用 live demo 版本带有有限的功能,或部署您自己的 OAS Editor。

5.5. ActiveDocs 自动填充 API 凭证

自动填充 API 凭证是 OAS 在 3scale ActiveDocs 中非常有用的扩展。您可以根据 API 验证模式,使用以下值定义 x-data-threescale-name 字段:

  • user_keys:返回仅使用 API 密钥身份验证的服务应用程序的用户密钥。
  • app_ids :返回使用 App ID/App Key 的服务应用程序的 ID。OAuth 和 OpenID Connect 也支持向后兼容。
  • app_keys:返回使用 App ID/App Key 的服务应用程序的密钥。OAuth 和 OpenID Connect 也支持向后兼容。
注意

x-data-threescale-name 字段是一个 OAS 扩展,在 ActiveDocs 域外被忽略。

API 密钥身份验证示例

以下示例演示了如何将 "x-data-threescale-name": "user_keys" 用于只使用 API 密钥身份验证:

"parameters": [
  {
    "name": "user_key",
    "in": "query",
    "description": "Your API access key",
    "required": true,
    "schema": {
      "type": "string"
    },
    "x-data-threescale-name": "user_keys"
  }
]

对于使用 x-data-threescale-name 声明的参数,当您登录开发人员门户时,您会看到带有 5 个最新的键、用户键、App Id 或 App 键的下拉列表,具体取决于规格中配置的值。因此,您可以在不需要复制并粘贴值的情况下自动填充输入:

登录后自动填充

第 6 章 ActiveDocs 和 OAuth

ActiveDocs 允许用户从一个位置测试和调用启用了 OAuth 的 API。

先决条件

6.1. 3scale 规格中的客户端凭证和资源所有者流示例

第一个示例是在 3scale 规格中使用 OAuth 2.0 客户端凭证流的 API。此 API 接受任何路径并返回有关请求的信息(path、请求标头、标头等)。Echo API 只能通过有效的访问令牌访问。API 的用户只能在为访问令牌交换其凭据(client_idclient_secret)进行调用。

若要让用户能够从 ActiveDocs 调用 API,用户必须请求访问令牌。由于这仅仅是对 OAuth 授权服务器的调用,您可以为 OAuth 令牌端点创建 ActiveDocs 规格。这允许从 ActiveDocs 中调用此端点。在这种情况下,对于客户端凭证流,Swagger JSON 规格如下:

{
  "swagger": "2.0",
  "info": {
    "version": "v1",
    "title": "OAuth for Echo API",
    "description": "OAuth2.0 Client Credentails Flow for authentication of our Echo API.",
    "contact": {
      "name": "API Support",
      "url": "http://www.swagger.io/support",
      "email": "support@swagger.io"
    }
  },
  "host": "red-hat-sso-instance.example.com",
  "basePath": "/auth/realms/realm-example/protocol/openid-connect",
  "schemes": [
    "http"
  ],
  "paths": {
    "/token": {
      "post": {
        "description": "This operation returns the access token for the API. You must call this before calling any other endpoints.",
        "operationId": "oauth",
        "parameters": [
          {
            "name": "client_id",
            "description": "Your client id",
            "type": "string",
            "in": "query",
            "required": true
          },
          {
            "name": "client_secret",
            "description": "Your client secret",
            "type": "string",
            "in": "query",
            "required": true
          },
          {
            "name": "grant_type",
            "description": "OAuth2 Grant Type",
            "type": "string",
            "default": "client_credentials",
            "required": true,
            "in": "query",
            "enum": [
                "client_credentials",
                "authorization_code",
                "refresh_token",
                "password"
            ]
          }
        ]
      }
    }
  }
}

对于资源所有者 OAuth 流,请为用户名和密码添加参数,以及提供访问令牌所需的其他参数。对于这个客户端凭证流,您要发送 client_idclient_secret,这可从对签名用户的 3scale 值填充,以及 grant_type。

然后,在 Echo API 的 ActiveDocs 规格中,添加 access_token 参数,而不是 client_idclient_secret

{
  "swagger": "2.0",
  "info": {
    "version": "v1",
    "title": "Echo API",
    "description": "A simple API that accepts any path and returns information about the request",
    "contact": {
      "name": "API Support",
      "url": "http://www.swagger.io/support",
      "email": "support@swagger.io"
    }
  },
  "host": "echo-api.3scale.net",
  "basePath": "/v1/words",
  "schemes": [
    "http"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/{word}.json": {
      "get": {
        "description": "This operation returns information about the request (path, request parameters, headers, etc.),
        "operationId": "wordsGet",
        "summary": "Returns the path of a given word",
        "parameters": [
          {
            "name": "word",
            "description": "The word related to the path",
            "type": "string",
            "in": "path",
            "required": true
          },
          {
            "name": "access_token",
            "description": "Your access token",
            "type": "string",
            "in": "query",
            "required": true
          }
        ]
      }
    }
  }
}

然后您可以在 Developer Portal 中包含 ActiveDocs。在这种情况下,由于您想要指定它们显示具有 OAuth 端点的顺序,因此类似如下:

{% active_docs version: "2.0" services: "oauth" %}





<script type="text/javascript">
  $(function () {
    window.swaggerUi.load(); // <-- loads first swagger-ui

    // do second swagger-ui

    var url = "/swagger/spec/echo-api.json";
    window.anotherSwaggerUi = new SwaggerUi({
      url: url,
      dom_id: "another-swagger-ui-container",
      supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
      onComplete: function(swaggerApi, swaggerUi) {
        $('#another-swagger-ui-container pre code').each(function(i, e) {hljs.highlightBlock(e)});
      },
      onFailure: function(data) {
        log("Unable to Load Echo-API-SwaggerUI");
      },
      docExpansion: "list",
      transport: function(httpClient, obj) {
        log("[swagger-ui]>>> custom transport.");
        return ApiDocsProxy.execute(httpClient, obj);
      }
    });

    window.anotherSwaggerUi.load();

  });
</script>

6.2. 在开发者门户中发布 ActiveDocs

在本教程结束时,您将在开发人员门户中发布您的 ActiveDoc,您的 API 文档将自动执行。

先决条件

  • 需要您的 REST API 兼容的 OpenAPI 规格(OAS)在开发者门户上打开 ActiveDocs。

流程

  • 将以下代码片段添加到开发人员门户的任何页面的内容。您必须通过 3scale 管理门户进行此操作。

    注意

    SERVICE_NAME 应当是服务规格的系统名称,本例中为 pet_store

    使用 OAS 3.0 的开发者门户配置

    {% content_for javascripts %}
     {{ 'active_docs.js' | javascript_include_tag }}
    {% endcontent_for %}
    
    {% assign spec = provider.api_specs.first %}
    
    <h1>Documentation</h1>
    
    <div class="swagger-section">
     <div id="message-bar" class="swagger-ui-wrap"></div>
     <div id="swagger-ui-container" class="swagger-ui-wrap"></div>
    </div>
    
    <script type="text/javascript">
     (function () {
       var url = "{{spec.url}}";
       var serviceEndpoint = "{{spec.api_product_production_public_base_url}}"
       SwaggerUI({ url: url, dom_id: "#swagger-ui-container" }, serviceEndpoint);
     }());
    </script>

    使用 OAS 2.0 的开发者门户配置

    <h1>Documentation</h1>
    <p>Use our live documentation to learn about Echo API</p>
    {% active_docs version: "2.0" services: "SERVICE_NAME" %}
    {% cdn_asset /swagger-ui/2.2.10/swagger-ui.js %} {% cdn_asset /swagger-ui/2.2.10/swagger-ui.css %} {% include 'shared/swagger_ui' %}
    <script type="text/javascript">
      $(function () {
        {% comment %}
          // you have access to swaggerUi.options object to customize its behavior
          // such as setting a different docExpansion mode
          window.swaggerUi.options['docExpansion'] = 'none';
          // or even getting the swagger specification loaded from a different url
          window.swaggerUi.options['url'] = "http://petstore.swagger.io/v2/swagger.json";
        {% endcomment %}
        window.swaggerUi.load();
      });
    </script>

在开发者门户中发布 ActiveDocs 时,这些额外注意事项:

  • 在一个页面中只能指定一个服务。如果要显示多个规格,最佳的方法是在不同的页面上执行它。
  • 这个片段需要 jQuery,它默认包含在开发人员门户的主布局中。如果从主布局中删除 jQuery 依赖项,您必须将这个依赖项添加到包含 ActiveDocs 的页面中。
  • 确保管理门户上启用了 Liquid 标签。
  • OAS 2.0 {{ '{% active_docs version: "2.0" ' }}%} 的 Liquid 标签中使用的版本应该与 Swagger spec 的对应版本。

如果要从外部来源获取您的规格,请按如下所示更改 JavaScript 代码:

$(function () {
 window.swaggerUi.options['url'] = "SWAGGER_JSON_URL";
 window.swaggerUi.load();
});

请注意,包含规范来源的行 window.swaggerUi.options['url'] = "SWAGGER_JSON_URL"; 在注释块之外。

验证步骤

在创建 OpenAPI 规格 并将其添加到 3scale 后,需要发布规格并将其链接到您的 API 开发人员使用。

第 7 章 APIcast 自我管理(旧版本)和 OAuth 2.0

注意

本节的详细信息仅供参考。这个选项不再被支持,您应该考虑在最早的机会中从此配置迁移。

所有 OAuth 调用都强制使用 SSL。

本文档使用了旧版本的 APIcast 的 OAuth,它由 Nginx 可下载的配置文件组成。请注意,自 2017 年 5 月以来,该版本在 GUI 中针对新客户不再可用。有关最新版本的 APIcast 中 OAuth 支持的详情,请参考 此处

本教程演示了使用 3scale 的 OAuth 扩展设置 APIcast 自我管理所需的步骤,使 APIcast 充当 OAuth 2.0 供应商。

目前,APIcast 中仅提供授权代码(服务器端)授予流。但是,您可以找到此 GitHub 仓库 上所有其他流的配置模板

7.1. 先决条件

因为 3scale 不包含您进行身份验证的用户的任何详情,以便使用 OAuth 2.0 与 3scale 集成,因此我们要求您自行处理用户身份验证。为此,您必须提供 APIcast 可以向用户授权应用程序的页面的 URL。此页面应位于登录后,以便正确识别和验证用户。用户通过身份验证并授权应用后,您应该通过用户授权的结果重新重定向到 APIcast。

当 APIcast 将用户重定向到授权 URL 时,它将发送以下参数以及请求:

  • Scope: 应用所属的计划 ID。应用计划定义 3scale 中的范围。
  • State : 在 APIcast 和 API 之间共享的哈希值来标识请求并确保其真实性。
  • tok: 在应用程序被授权时向用户授予的访问令牌值。只有在为授权代码交换令牌时,才会发布令牌。如果没有交换授权代码,则访问令牌将在 10 分钟后过期。

如果用户成功识别自己并授权应用程序,授权页面应重定向到 APIcast 上的端点。默认情况下,这位于 /callback 中,但可以在 APIcast 配置文件中轻松更改以适合您的需求。

进行查找并查看如何设置此设置。

7.2. OAuth 配置

要继续安装,您需要遵循与基本 APIcast 集成相同的大多数步骤来配置 API,并定义您的方法和 enpdoint。您可以在链接中找到这些步骤: 安装 APIcast 文档。另外,您需要确保遵循以下步骤:

7.2.1. 第 1 步:编辑集成设置

根据下面的屏幕截图,您需要将"产品部署选项"设置为自我管理网关,因为 OAuth 目前在 APIcast 托管上不可用。

OAuth APIcast 设置

在同一页面上,您还需要将"身份验证"设置为 OAuth 2.0。

7.2.2. 第 2 步:您的 OAuth 授权端点声明

当用户需要登录您的服务以自行验证并提供支持时,这将是您的用户所呈现的 url。

APIcast OAuth 扩展允许 APIcast 作为 OAuth 提供程序。但是,您仍需要为用户提供授权端点来对自身进行身份验证并批准/拒绝第三方应用程序访问。此授权端点应在登录后面,以便识别和验证用户。批准完成后,您需要将登录的用户重定向到 APIcast 上的回调端点,以便可以处理其余工作流。

7.2.3. 第 3 步:下载 APIcast 配置文件

3scale 根据您在集成页面中输入的数据自动生成使用 APIcast 作为 API 网关和 OAuth 供应商所需的所有文件。输入所有所需信息后,您可以下载这些文件并将它们安装到您自己的 APIcast 实例中。下载的 zip 文件将包含分别定义的每个服务以及 lua 文件,以支持 OAuth 握手和跨服务共享的 nginx_\*.conf 文件。

如果您定义了多个服务,则下载配置文件的用户将收到 zip 文件,其中 Lua 文件将仅包含与他们有权访问的服务对应的 Service 令牌。这样,Provider Key 只会将 secret 保留为完整管理员。

7.3. 运行自我管理的 APIcast 实例(生产环境)

如果您熟悉 NGINX,则不应花费很长时间才能在本地启动并运行 APIcast。请注意,您的 NGINX 安装必须具有 Lua 插件,以及某些 OAuth 2.0 授权类型,您还必须在服务器上安装 Redis。

如果您不熟悉 NGINX,我们建议您安装 OpenResty,它是一个 fantastic web 应用程序,它基本上是标准 NGINX 内核的捆绑包,其中几乎是需要构建的所有第三方 NGINX 模块。

7.3.1. 第 1 步:安装依赖项(用于 Ubuntu)

对于 Debian/Ubuntu linux 发行版本,您应该使用 apt-get 安装以下软件包:

sudo apt-get install libreadline-dev libncurses5-dev libpcre3 libpcre3-dev libssl-dev perl
sudo apt-get build-dep nginx

对于不同的系统,请查看 OpenResty 文档。

7.3.2. 第 2 步:编译并安装 OpenResty

下载代码并编译,使用所需版本更改 VERSION (通常建议运行最新的稳定版本)。

wget http://agentzh.org/misc/nginx/ngx_openresty-VERSION.tar.gz
tar -zxvf ngx_openresty-VERSION.tar.gz
cd ngx_openresty-VERSION/

./configure --prefix=/opt/openresty --with-luajit --with-http_iconv_module -j2

make
make install

此时,您已使用 OpenResty 捆绑包安装 NGINX 和 Lua。

7.3.3. 第 3 步:安装 Redis

在 APIcast 服务器上下载并安装 Redis (我们建议使用最新的稳定版本。)

tar zxvf  redis-VERSION.tar.gz
cd redis-VERSION
make
sudo make install

要安装并运行 Redis 服务器,请运行以下命令,接受所有默认值:

sudo ./utils/install_server.sh

7.3.4. 第 4 步:从 3scale 下载 APIcast 配置

请注意,目前只有授权代码(服务器端)授予流配置可从 Integration 页面下载。但是,您可以在 GitHub 仓库中找到所有其他流的 配置模板

Download 按钮,从 3scale 下载 APIcast 配置文件。这将为您提供一个 zip 文件,其中有六个文件:

  • authorize.lua - 此文件包含授权客户端的逻辑,将 end_user 重定向到 OAuth 登录页面,生成访问令牌,并检查返回 URL 是否与 API 买家指定 URL 匹配的逻辑。它在 /authorize 端点命中时运行。
  • authorized_callback.lua - 此文件包含将 API 后端用户重定向到 API 买方重定向 URL 的逻辑。作为 API 供应商,一旦用户成功登录并授权 API 购买者访问,您将需要调用此端点。当 web 应用程序调用 /callback 端点时,将执行此文件。
  • get_token.lua - 此文件包含返回由 client_id 标识的客户端的访问令牌的逻辑。当 /oauth/token 端点被调用时,它将执行。
  • nginx centers.conf - .conf 是一个典型的 NGINX 配置文件。如果您已在运行 NGINX,可以对其进行编辑或将其复制到现有的 .conf 中。
  • nginx FirmwareSchema.lua - 此文件包含您在 web 界面上定义的逻辑,以跟踪各种指标和方法的使用情况。
  • threescale_utils.lua

7.3.5. 第 5 步:启动和停止 APIcast

需要做的唯一事情是启动 APIcast。有很多方法可以做到这一点,但最直接的方法是:

sudo /opt/openresty/nginx/sbin/nginx -p /opt/openresty/nginx/ -c /opt/openresty/nginx/conf/YOUR-CONFIG-FILE.conf

示例假定 APIcast 的工作目录为 /opt/openresty/nginx,这是在安装过程中传递的路径,以配置 --prefix=/opt/openresty。您可以更改它,但请注意用户权限。

该示例还假定 3scale 生成的 .conf 放置在 /opt/openresty/nginx/conf/ 中。当然,您应该将文件和目录放在最适合您的生产环境的位置,以及启动和停止进程作为系统守护进程,而不是直接执行二进制文件。

停止正在运行的 APIcast 实例:

sudo /opt/openresty/nginx/sbin/nginx -p /opt/openresty/nginx/ -c /opt/openresty/nginx/conf/YOUR-CONFIG-FILE.conf -s stop

选项 -s 允许您向 nginx 传递信号。将停止的进程是其 .pid 存储在 /opt/openresty/nginx/logs/nginx.pid 中的进程。

APIcast 日志默认位于同一目录中: /opt/openresty/nginx/logs/。在设置整个进程时检查 error.log。

7.3.6. 第 6 步:测试您的 OAuth 流

测试您的 API 现在是否支持 OAuth 的最佳方法是使用 Google 的 OAuth playground: https://developers.google.com/oauthplayground

您需要为您要用来测试它的应用程序设置重定向 URL: https://developers.google.com/oauthplayground

然后,您可以按照以下屏幕截图填写设置:

Google OAuth Playground 设置

授权和令牌端点 URL 是 APIcast 实例的 URL。在范围内,为应用程序放置应用计划的名称(如 "Default")。

点 Authorize API,这将把您重定向到您的登录 URL。然后,登录到应用程序上的用户帐户并授权应用程序。完成后,您将使用授权代码重定向到 Google OAuth Playground。将其交换用于访问令牌。现在,您有一个访问令牌才能在 API 上调用受保护的端点。

现在,您可以向 API 发出请求,但将 API 后端主机名(在示例 echo-api.3scale.net 中)替换为 APIcast 实例的主机名并添加 access_token 参数。例如:

curl -X GET "http://YOUR_APICAST_HOST/read?access_token=YOUR_ACCESS_TOKEN"

现在,您的 API 与 3scale 集成。

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.