Kong鑒權(quán)向?qū)?/h2>

簡介

傳入用戶 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)功能,流程如下所示:

  1. 在服務(wù)上添加一個鑒權(quán)插件,或者全局添加;
  2. 創(chuàng)建一個消費(fèi)者實(shí)體;
  3. 為消費(fèi)者提供鑒權(quán)方法需要的鑒權(quán)憑證;
  4. 現(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容