在 APISIX 中使用 key-auth
插件实现基于密钥的认证,以下是详细的配置步骤,包括如何保存密钥和证书,以及如何将这些信息分配给客户端 A 和 B。
场景说明
- 服务 C 是后端服务,需要通过 APISIX 代理。
- 客户端 A 和 B 需要唯一的密钥(
key
)来访问服务 C。 - APISIX 使用
key-auth
插件对请求进行身份验证。
步骤 1:生成密钥和证书
虽然你提到了证书,但 key-auth
插件本身并不直接处理证书,而是基于预定义的密钥(key
)进行认证。通常,你只需为每个客户端生成一个唯一的密钥即可。
为客户端 A 和 B 生成密钥:
# 为客户端 A 生成密钥 echo "client-a-key" > client_a.key # 为客户端 B 生成密钥 echo "client-b-key" > client_b.key
步骤 2:配置 APISIX 的消费者(Consumer)
APISIX 的 Consumer
实体用于管理不同的客户端及其认证信息。我们需要为客户端 A 和 B 各创建一个消费者,并为每个消费者绑定一个唯一的密钥。
配置消费者 A:
通过 APISIX 的 Admin API 创建消费者 A:
curl -X PUT http://{APISIX_ADMIN_API}/apisix/admin/consumers/client-a -H 'Content-Type: application/json' -d '{ "username": "client-a", "plugins": { "key-auth": { "key": "client-a-key" } } }'
配置消费者 B:
通过 APISIX 的 Admin API 创建消费者 B:
curl -X PUT http://{APISIX_ADMIN_API}/apisix/admin/consumers/client-b -H 'Content-Type: application/json' -d '{ "username": "client-b", "plugins": { "key-auth": { "key": "client-b-key" } } }'
步骤 3:配置路由并启用 key-auth
插件
现在需要为服务 C 配置路由,并启用 key-auth
插件以保护该路由。
配置路由:
通过 Admin API 创建路由:
curl -X PUT http://{APISIX_ADMIN_API}/apisix/admin/routes/1 -H 'Content-Type: application/json' -d '{ "uri": "/service-c/*", "upstream": { "type": "roundrobin", "nodes": { "http://backend-service-c:80": 1 } }, "plugins": { "key-auth": {} } }'
uri
:/service-c/*
表示匹配所有以/service-c/
开头的请求路径。upstream
: 指向后端服务 C 的地址。plugins.key-auth
: 启用key-auth
插件。
步骤 4:客户端调用服务
客户端 A 和 B 在调用服务时需要携带各自的密钥作为身份验证凭据。密钥应放在 HTTP 请求头中。
客户端 A 调用服务:
curl -X GET http://{APISIX_GATEWAY}/service-c/resource -H "apikey: client-a-key"
客户端 B 调用服务:
curl -X GET http://{APISIX_GATEWAY}/service-c/resource -H "apikey: client-b-key"
apikey
: HTTP 请求头中的键名,默认是apikey
,也可以通过插件配置修改。
apikey如果错误,返回401
步骤 5:密钥的管理和分发
- 私钥和证书的存储:如果你需要更高的安全性,可以将密钥存储在安全的地方,例如加密存储或者环境变量中。
- 分发密钥:
- 将密钥(如
client-a-key
和client-b-key
)分发给客户端 A 和 B。 - 不要将私钥泄露给其他未授权的客户端。
- 如果需要更高的安全性,可以定期轮换密钥。
- 将密钥(如
总结
通过上述配置:
- 后端服务 C 被路由
/service-c/*
所代理。 - 只有持有正确密钥的客户端(A 或 B)才能访问服务 C。
- 密钥通过
key-auth
插件进行验证,密钥存储在 APISIX 的消费者配置中。
4