apisix~key-auth多消費的使用
在 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
浙公網安備 33010602011771號