簡介
傳入用戶 upstream service 的流量(API或者微服務(wù))通常受應(yīng)用和Kong各種鑒權(quán)插件控制,由于Kong的服務(wù)實(shí)體與用戶的 upstream service 是一一對應(yīng)的,所以比較簡單的方案是直接在服務(wù)上配置鑒權(quán)插件
通用身份認(rèn)證
通常情況下,用戶需要添加鑒權(quán)功能,并且不允許任何未經(jīng)鑒權(quán)的請求訪問,用戶可以使用任一鑒權(quán)插件實(shí)現(xiàn)這項(xiàng)功能,流程如下所示:
- 在服務(wù)上添加一個鑒權(quán)插件,或者全局添加;
- 創(chuàng)建一個消費(fèi)者實(shí)體;
- 為消費(fèi)者提供鑒權(quán)方法需要的鑒權(quán)憑證;
- 現(xiàn)在當(dāng)請求進(jìn)入Kong之后,都會校驗(yàn)提供的憑證,如果請求校驗(yàn)失敗,Kong會阻斷該請求;校驗(yàn)成功后會將消費(fèi)者和憑證信息加入請求頭并轉(zhuǎn)發(fā)請求;
上面的通用流程不是每一步都是必須的,比如在使用LDAP等外部身份驗(yàn)證時,不會識別任何消費(fèi)者,請求頭中只會添加憑證信息,具體驗(yàn)證細(xì)節(jié)和示例可以在每個插件的各自文檔中找到
消費(fèi)者
消費(fèi)者這個概念簡單理解起來可以和用戶一一對應(yīng),消費(fèi)者的核心原則是用戶可以在上面附加插件,并定制請求行為,用戶可能有多個手機(jī)應(yīng)用,用戶可以對每一個應(yīng)用,或每一個版本,或每一個平臺(比如安卓、IOS)定義一個消費(fèi)者
匿名接入
Kong可以使服務(wù)同時滿足鑒權(quán)接入和匿名接入,用戶可能會對鑒權(quán)接入和匿名接入提供不同的限流策略
要配置這樣的服務(wù),首先需要使用鑒權(quán)插件,然后創(chuàng)建一個新的消費(fèi)者來表示匿名用戶,然后配置鑒權(quán)插件允許匿名接入,以下是配置流程:
創(chuàng)建示例服務(wù)和路由
發(fā)送下列指令創(chuàng)建 example-service ,這個服務(wù)指向 mockbin.org,會回顯請求:
curl -i -X POST --url http://localhost:8001/services/ --data 'name=example-service' --data 'url=http://mockbin.org/request'
添加路由:
curl -i -X POST --url http://localhost:8001/services/example-service/routes --data 'paths[]=/auth-sample'
http://localhost:8000/auth-sample 這個url會回顯任何請求
在服務(wù)上配置key-auth插件
發(fā)送下列指令在服務(wù)上添加一個插件:
curl -i -X POST --url http://localhost:8001/services/example-service/plugins/ --data 'name=key-auth'
注意記錄插件的id,我們會在后續(xù)用到
驗(yàn)證key-auth插件是否已配置
發(fā)送下列指令,驗(yàn)證key-auth插件是否已正確配置:
curl -i -X GET --url http://localhost:8000/auth-sample
由于此處用戶沒有指定 apikey 頭,并且沒有配置匿名接入,所以會返回 403 Forbidden
HTTP/1.1 403 Forbidden
...
{
"message": "No API key found in headers or querystring"
}
創(chuàng)建一個匿名消費(fèi)者
Kong代理每個請求必須與消費(fèi)者關(guān)聯(lián),所以可以通過發(fā)送下列指令創(chuàng)建一個名字為 anonymous_users 的消費(fèi)者
curl -i -X POST --url http://localhost:8001/consumers/ --data "username=anonymous_users"
用戶會得到一個類似如下的響應(yīng):
HTTP/1.1 201 Created
Content-Type: application/json
Connection: keep-alive
{
"username": "anonymous_users",
"created_at": 1428555626000,
"id": "bbdf1c48-19dc-4ab7-cae0-ff4f59d87dc9"
}
注意記錄消費(fèi)者的id,我們會在后續(xù)用到
啟用匿名接入
用戶現(xiàn)在可以重新配置key-auth插件啟用匿名接入功能:
curl -i -X PATCH --url http://localhost:8001/plugins/<your-plugin-id> --data "config.anonymous=<your-consumer-id>"
config.anonymous=<your-consumer-id> 參數(shù)表示此服務(wù)上的key-auth插件允許匿名訪問,并關(guān)聯(lián)到之前配置的消費(fèi)者上,在配置時需要預(yù)先存留的id,Kong會檢驗(yàn)id的有效性,輸入不存在的id會導(dǎo)致不正確的配置
檢測匿名接入是否生效
發(fā)送下列指令,檢測匿名接入是否生效:
curl -i -X GET --url http://localhost:8000/auth-sample
這個請求和之前的請求相同,但是請求成功了,因?yàn)榇颂巻⒂昧四涿L問,響應(yīng)如下所示:
{
...
"headers": {
...
"x-consumer-id": "713c592c-38b8-4f5b-976f-1bd2b8069494",
"x-consumer-username": "anonymous_users",
"x-anonymous-consumer": "true",
...
},
...
}
多重認(rèn)證
Kong支持對服務(wù)添加多重身份認(rèn)證,允許不同的客戶端使用不同的鑒權(quán)方法接入服務(wù),鑒權(quán)插件可以根據(jù) 與或 邏輯結(jié)合,這些通過 config.anonymous 屬性配置
- 沒有設(shè)置
config.anonymous
如果該屬性為空,那么鑒權(quán)插件永遠(yuǎn)會執(zhí)行鑒權(quán)操作,如果未經(jīng)驗(yàn)證,就會返回40X響應(yīng),當(dāng)有多個插件時,它們之間是與邏輯 - 設(shè)置了
config.anonymous
這種情況下鑒權(quán)插件只會在尚未經(jīng)過鑒權(quán)的情況下執(zhí)行鑒權(quán),當(dāng)鑒權(quán)失敗后,不會返回40X響應(yīng),而是使用匿名消費(fèi)者,多個插件之間是或邏輯
注1:鑒權(quán)插件只能 全部 或者 全不 配置匿名接入,如果混合配置,結(jié)果是不確定的
注2:當(dāng)使用 與 邏輯時,最后一個匹配的插件的憑證信息會傳入 upstream service;當(dāng)使用 或 邏輯時,第一個匹配的插件的憑證信息或者最后一個插件的匿名消費(fèi)者會傳入 upstream service
注3:當(dāng)以 與 邏輯與其他插件共用 OAuth2 插件時,用戶請求令牌的 OAuth2 端點(diǎn)也需要其他已配置的鑒權(quán)插件的身份校驗(yàn)