密钥认证
API 网关的主要作用是连接 API 消费者和提供者。出于安全原因,在允许消费者访问上游资源之前,它应该对消费者进行身份验证和授权。

APISIX 具有灵活的插件扩展系统,并拥有许多用于用户身份验证和授权的现有插件。例如:
- Key Authentication
- Basic Authentication
- HMAC
- JSON Web Token (JWT) Authentication
- OpenID Connect
- Keycloak Authorization
- Casdoor Authorization
- Casbin Authorization
- Open Policy Agent (OPA)
- Wolf RBAC
- Central Authentication Service (CAS)
- LDAP
- Forward Authentication
在本教程中,你将创建一个消费者,使用密钥认证配置其凭证,并学习如何启用和禁用密钥认证。
关键概念
消费者
消费者 是指使用 API 的应用程序或开发者。
在 APISIX 中,创建消费者需要一个唯一的 username。作为密钥认证配置的一部分,你还需要将上述列表中的身份验证插件之一添加到消费者的 plugin 字段中。
密钥认证
密钥认证是一种相对简单但广泛使用的身份验证方法。其思路如下:
- 管理员将身份验证插件添加到路由。
- API 消费者在发送请求时,将密钥附加到查询字符串或请求头中以进行身份验证。
前置条件
- 完成 安装 APISIX 以在 Docker 或 Kubernetes 中安装 APISIX。
- 完成 配置路由。
- 如果使用这些工具,请安装 ADC 或 APISIX-MCP。
配置密钥认证
- Admin API
- ADC
- Ingress Controller
- APISIX-MCP
创建消费者
创建消费者 tom:
请在生产环境中使用复杂的密钥。
curl -i "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d '
{
"username": "tom"
}'
如果消费者创建成功,你将收到 HTTP/1.1 201 Created 响应。
配置消费者凭证
为 tom 配置 key-auth 凭证:
curl "http://127.0.0.1:9180/apisix/admin/consumers/tom/credentials" -X PUT -d '
{
"id": "cred-tom-key-auth",
"plugins": {
"key-auth": {
"key": "secret-key"
}
}
}'
如果消费者凭证创建成功,你将收到 HTTP/1.1 201 Created 响应。
启用身份验证
更新 配置路由 中的 getting-started-ip 路由以添加 key-auth 插件:
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
"plugins": {
"key-auth": {}
}
}'
如果路由更新成功,你将收到 HTTP/1.1 200 OK 响应。
创建一个包含消费者和路由的 ADC 配置文件:
consumers:
- username: tom
credentials:
- name: tom-key
type: key-auth
config:
key: secret-key
services:
- name: httpbin Service
routes:
- uris:
- /ip
name: getting-started-ip
plugins:
key-auth: {}
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
将配置同步到 APISIX:
adc sync -f adc.yaml
如果你使用 Gateway API,应首先配置 GatewayClass 和 Gateway 资源:
显示配置
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: apisix
spec:
controllerName: apisix.apache.org/apisix-ingress-controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
namespace: ingress-apisix
name: apisix
spec:
gatewayClassName: apisix
listeners:
- name: http
protocol: HTTP
port: 80
infrastructure:
parametersRef:
group: apisix.apache.org
kind: GatewayProxy
name: apisix-config
请注意,Gateway 监听器中的 port 是必需的,但被忽略。这是由于数据平面的限制:它无法动态打开新端口。由于 Ingress Controller 不管理数据平面部署,它无法自动更新配置或重新启动数据平面以应用端口更改。
如果你使用 Ingress 或 APISIX 自定义资源,则无需额外配置即可继续,因为下面的 IngressClass 资源已随安装一起应用:
显示配置
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: apisix
spec:
controller: apisix.apache.org/apisix-ingress-controller
parameters:
apiGroup: apisix.apache.org
kind: GatewayProxy
name: apisix-config
namespace: ingress-apisix
scope: Namespace
有关参数的更多信息,请参阅 定义控制器和网关。
- Gateway API
- APISIX CRD
创建一个 Kubernetes 清单文件以配置消费者:
apiVersion: apisix.apache.org/v1alpha1
kind: Consumer
metadata:
namespace: ingress-apisix
name: tom
spec:
gatewayRef:
name: apisix
credentials:
- type: key-auth
name: primary-key
config:
key: secret-key
创建一个 Kubernetes 清单文件以配置路由并启用密钥认证:
apiVersion: v1
kind: Service
metadata:
namespace: ingress-apisix
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: ingress-apisix
name: auth-plugin-config
spec:
plugins:
- name: key-auth
config:
_meta:
disable: false
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: ingress-apisix
name: getting-started-ip
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /ip
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: auth-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
将配置应用到你的集群:
kubectl apply -f consumer.yaml -f httpbin-route.yaml
创建一个 Kubernetes 清单文件以配置消费者:
apiVersion: apisix.apache.org/v2
kind: ApisixConsumer
metadata:
namespace: ingress-apisix
name: tom
spec:
ingressClassName: apisix
authParameter:
keyAuth:
value:
key: secret-key
创建一个 Kubernetes 清单文件以配置路由并启用密钥认证:
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: ingress-apisix
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: ingress-apisix
name: getting-started-ip
spec:
ingressClassName: apisix
http:
- name: getting-started-ip
match:
paths:
- /ip
upstreams:
- name: httpbin-external-domain
plugins:
- name: key-auth
enable: true
将配置应用到你的集群:
kubectl apply -f consumer.yaml -f httpbin-route.yaml
在你的 AI 客户端中输入以下提示:
Create a consumer named tom in APISIX and the key-auth credential for the consumer should be secret-key.
Enable the key-auth plugin on the route getting-started-ip, requiring consumers to provide an API key when accessing that route.