key-auth插件
key-auth插件實(shí)現(xiàn)了基于API Key進(jìn)行認(rèn)證鑒權(quán)的功能,支持從HTTP請(qǐng)求的URL參數(shù)或者請(qǐng)求頭解析API Key,同時(shí)驗(yàn)證該API Key是否有權(quán)限訪問(wèn)。本文介紹如何配置key-auth插件。
插件類型
認(rèn)證鑒權(quán)。
配置字段
認(rèn)證配置
名稱 | 數(shù)據(jù)類型 | 填寫要求 | 默認(rèn)值 | 描述 |
consumers | array of object | 必填。 | - | 配置服務(wù)的調(diào)用者,用于對(duì)請(qǐng)求進(jìn)行認(rèn)證。 |
keys | array of string | 必填。 | - | API Key的來(lái)源字段名稱,可以是URL參數(shù)或者HTTP請(qǐng)求頭名稱。 |
in_query | bool |
| true | 配置為 |
in_header | bool |
| true | 配置為 |
global_auth | array of string | 選填(**僅實(shí)例級(jí)別配置**) | - | 只能在實(shí)例級(jí)別配置,若配置為true,則全局生效認(rèn)證機(jī)制; 若配置為false,則只對(duì)做了配置的域名和路由生效認(rèn)證機(jī)制,若不配置則僅當(dāng)沒有域名和路由配置時(shí)全局生效(兼容老用戶使用習(xí)慣)。 |
子項(xiàng)consumers
中每一項(xiàng)的配置字段說(shuō)明如下。
名稱 | 數(shù)據(jù)類型 | 填寫要求 | 默認(rèn)值 | 描述 |
credential | string | 必填。 | - | 配置該consumer的訪問(wèn)憑證。 |
name | string | 必填。 | - | 配置該consumer的名稱。 |
鑒權(quán)配置(非必需)
名稱 | 數(shù)據(jù)類型 | 填寫要求 | 默認(rèn)值 | 描述 |
allow | array of string | 選填(**非實(shí)例級(jí)別配置**)。 | - | 只能在路由或域名等細(xì)粒度規(guī)則上配置,對(duì)于符合匹配條件的請(qǐng)求,配置允許訪問(wèn)的 consumer,從而實(shí)現(xiàn)細(xì)粒度的權(quán)限控制。 |
在一個(gè)規(guī)則里,鑒權(quán)配置和認(rèn)證配置不可同時(shí)存在。
對(duì)于通過(guò)認(rèn)證鑒權(quán)的請(qǐng)求,請(qǐng)求的Header會(huì)被添加一個(gè)
X-Mse-Consumer
字段,用以標(biāo)識(shí)調(diào)用者的名稱。
配置示例
全局配置認(rèn)證和路由粒度進(jìn)行鑒權(quán)
以下配置將對(duì)網(wǎng)關(guān)特定路由或域名開啟Key Auth認(rèn)證和鑒權(quán)。credential
字段不能重復(fù)。
在實(shí)例級(jí)別做如下插件配置:
global_auth: false
consumers:
- credential: 2bda943c-ba2b-11ec-ba07-00163e1250b5
name: consumer1
- credential: c8c8e9ca-558e-4a2d-bb62-e700dcc40e35
name: consumer2
keys:
- apikey
- x-api-key
在route-a
和route-b
兩個(gè)路由做如下插件配置:
allow:
- consumer1
在*.example.com
和test.com
兩個(gè)域名做如下插件配置:
allow:
- consumer2
此例指定的
route-a
和route-b
即在創(chuàng)建網(wǎng)關(guān)路由時(shí)填寫的路由名稱,當(dāng)匹配到這兩個(gè)路由時(shí),將允許name
為consumer1
的調(diào)用者訪問(wèn),其他調(diào)用者不允許訪問(wèn)。此例指定的
*.example.com
和test.com
用于匹配請(qǐng)求的域名,當(dāng)發(fā)現(xiàn)域名匹配時(shí),將允許name
為consumer2
的調(diào)用者訪問(wèn),其他調(diào)用者不被允許訪問(wèn)。
根據(jù)該配置,下列請(qǐng)求可以允許訪問(wèn)。假設(shè)以下請(qǐng)求會(huì)匹配到route-a這條路由。
將API Key設(shè)置在URL參數(shù)中。
curl http://xxx.hello.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
將API Key設(shè)置在HTTP請(qǐng)求頭中。
curl http://xxx.hello.com/test -H 'x-api-key: 2bda943c-ba2b-11ec-ba07-00163e1250b5'
認(rèn)證鑒權(quán)通過(guò)后,請(qǐng)求的Header中會(huì)被添加一個(gè)X-Mse-Consumer
字段,在此例中其值為consumer1
,用以標(biāo)識(shí)調(diào)用方的名稱。
下列請(qǐng)求將拒絕訪問(wèn)。
請(qǐng)求未提供API Key,返回401。
curl http://xxx.hello.com/test
請(qǐng)求提供的API Key無(wú)權(quán)訪問(wèn),返回401。
curl http://xxx.hello.com/test?apikey=926d90ac-ba2e-11ec-ab68-00163e1250b5
根據(jù)請(qǐng)求提供的API Key匹配到的調(diào)用者無(wú)訪問(wèn)權(quán)限,返回403。
# consumer2不在route-a的allow列表里 curl http://xxx.hello.com/test?apikey=c8c8e9ca-558e-4a2d-bb62-e700dcc40e35
網(wǎng)關(guān)實(shí)例級(jí)別開啟
以下配置將對(duì)網(wǎng)關(guān)實(shí)例級(jí)別開啟 Basic Auth 認(rèn)證,所有請(qǐng)求均需要經(jīng)過(guò)認(rèn)證后才能訪問(wèn)。
global_auth: true
consumers:
- credential: 2bda943c-ba2b-11ec-ba07-00163e1250b5
name: consumer1
- credential: c8c8e9ca-558e-4a2d-bb62-e700dcc40e35
name: consumer2
keys:
- apikey
- x-api-key
相關(guān)錯(cuò)誤碼
HTTP狀態(tài)碼 | 出錯(cuò)信息 | 原因說(shuō)明 |
401 | No API key found in request. | 請(qǐng)求未提供API Key。 |
401 | Request denied by Key Auth check. Invalid API key. | 不允許當(dāng)前API Key訪問(wèn)。 |
403 | Request denied by Basic Auth check. Unauthorized consumer. | 請(qǐng)求的調(diào)用方無(wú)訪問(wèn)權(quán)限。 |