跳到主要内容
版本:3.9.x

消费者

在本文档中,你将了解 API7 企业版中消费者(Consumers)的基本概念以及为什么需要它们。你将接触到几个相关的概念,包括如何将消费者信息传递给上游、消费者访问限制,以及消费者的身份验证和授权。

概述

消费者代表向 API 网关发送请求并使用后端服务的用户、应用程序或主机。它通常与身份验证系统一起使用。每个消费者必须配置至少一个身份验证凭证,或者使用如 Authz KeycloakOpenID Connect 等插件与外部身份验证系统集成。

下图展示了包含一个路由和两个消费者的 API7 网关示例。其中一个消费者 FetchBot 是一个数据抓取机器人,另一个消费者 JohnDoe 是一名用户。路由和消费者都启用了 key-auth 插件。因此,请求将使用 API 密钥(API keys)进行身份验证。为了访问内部服务,FetchBot 使用 bot-key 发送请求,而 JohnDoe 使用 john-key 发送请求。


consumers diagram example

这种配置确保了只有经过身份验证的请求才能与暴露在 /petstore 上的内部服务进行交互。

  • 如果向 API7 网关发送的请求没有携带任何密钥或携带了错误的密钥,该请求将被拒绝。
  • 如果向 API7 网关发送的请求携带了 bot-key,该请求将通过身份验证,并被识别为由 FetchBot 发送以从内部服务抓取数据。此时,应用在 FetchBot 消费者上的 Limit Count 插件将生效,将 5 秒窗口内的请求数量限制为 2 次。如果未达到限流阈值,请求将被转发到上游服务;否则,将被拒绝。
  • 如果向 API7 网关发送的请求携带了 john-key,该请求将通过身份验证,并被识别为由 JohnDoe 发送,随后将被转发到上游端点。

在这个场景中,根据插件的执行生命周期,身份验证插件会在 Limit Count 限流插件之前执行。

将消费者信息传递给上游

对于某些使用场景(如日志记录、分析和审计),你可能希望将消费者信息传递给上游服务。默认情况下,消费者信息不会暴露给上游;但是,你可以使用 Attach Consumer Label 插件将所需信息包含在请求头中。

消费者访问限制

你可以通过 Consumer Restriction 插件,基于消费者名称、HTTP 方法或其他参数施加限制,从而控制对你 API 的访问请求。

例如,如果你想在不更改任何消费者配置的情况下,将 FetchBot 列入黑名单以禁止其访问你的内部服务,请参考应用基于名单的访问控制

身份验证与授权

在基于 API7 网关的架构中,构建身份验证和授权主要有两种设计模式。

第一种也是最常用的方法是,通过第三方的身份提供者 (IdP)(例如 Keycloak)来对请求进行身份验证和授权:

API7 Gateway integration with an IdP

在某些环境中,一个请求可能需要经过多个 IdP 验证才能被转发到上游端点。在这种情况下,你可以配置多个身份验证插件,每个插件对应一个消费者上的一个 IdP。只有当所有 IdP 都授予该请求访问权限后,API7 网关才会返回成功的响应。

第二种也是更基础的方法是,直接在 API7 网关上使用内置凭证进行身份验证和授权。目前,支持的凭证包括密钥身份验证(Key Authentication)、基本身份验证(Basic Authentication)、JWT 身份验证(JWT Authentication)和 HMAC 身份验证(HMAC Authentication)。

与传统用户登录类似,每个消费者可以创建多个凭证,所有凭证都链接到一个统一的消费者身份。凭证应妥善保存并定期更新。

备注

消费者凭证(Consumer credentials)允许每个消费者拥有多个凭证,从而提供了更高的灵活性。它们取代了传统的身份验证插件(如 key-auth、basic-auth、jwt-auth 和 hmac-auth),提供了更友好的用户体验。

开发者与消费者的对比

API 开发者门户上的开发者(Developers)也可以管理 API 凭证并通过订阅来利用访问控制,但它们通常用于不同的场景。

开发者 (Developers)消费者 (Consumers)
凭证由开发者自行管理,对提供者不可见由提供者管理
API 访问控制开发者申请访问权限,提供者审批订阅。提供者可以直接将消费者添加或移除出白名单/黑名单。

开发者和消费者可以同时用于不同的 API,两者独立运行。但是,对于一个给定的已发布服务及其关联的 API 产品,应选择使用 API7 网关身份验证插件或 API 产品身份验证配置之一。

对于私有服务,通过 API7 网关内的消费者管理来限制访问。对于公共服务,将它们分组为明确定义的 API 产品,并通过 API 产品配置来管理开发者的访问权限。

强烈建议不要针对同一个已发布服务同时混合使用 API7 网关身份验证插件和 API 产品身份验证配置(仅在非常特殊的情况下例外)。这会导致身份验证冲突,需要提供多个凭证才能成功发起 API 请求。

更多资源