微服務Kong(九)——認證參考

  客戶端訪問上游API服務,一般由Kong的認證插件及其配置參數來控制。json

 

通用認證api

  通常狀況下,上游API服務都須要客戶端有身份認證,且不容許錯誤的認證或無認證的請求經過。認證插件能夠實現這一需求。這些插件的通用方案/流程以下:app

    一、向一個API或全局添加AUTH插件(此插件不做用於consumers);curl

    二、常見一個consumer對象;測試

    三、爲consumer提供指定的驗證插件方案的身份驗證憑據;ui

    四、如今,只要有請求進入Kong,都將檢查其提供的身份驗證憑據(取決於auth類型),若是該請求沒法被驗證或者驗證失敗,則請求會被鎖定,不執行向上有服務轉發的操做。url

  可是,上述的通常流程並非老是有效的。譬如,當使用了外部驗證方案(好比LDAP)時,KONG就不會(不須要)對consumer進行身份驗證。spa

 

Consumers插件

  最簡單的理解和配置consumer的方式是,將其於用戶進行一一映射,即一個consumer表明一個用戶(或應用)。可是對於KONG而言,這些都無所謂。consumer的核心原則是你能夠爲其添加插件,從而自定義他的請求行爲。因此,或許你會有一個手機APP應用,併爲他的每一個版本都定義一個consumer,又或者你又一個應用或幾個應用,併爲這些應用定義統一個consumer,這些都無所謂。這是一個模糊的概念,他叫作consumer,而不是user!萬萬要區分開來,且不可混淆。代理

 

匿名訪問

  在Kong 0.10.x版本以前,你能夠將指定的API配置爲僅容許通過身份驗證的訪問(經過插件來實現)或只容許匿名訪問。也就是說,一個指定的API,不容許對於某些consumer實行身份驗證,而對於另外的consumer實行匿名訪問。

  在0.10.x版本之後,這些限制取消了--同一個API能夠同時實現驗證和匿名兩種訪問方式。你可使用他的這種特性,爲一個API提供兩種服務方式:以較低的速率提供匿名訪問權限,以較高的速率實現驗證訪問權限。爲指定API提供一個用戶試用體驗。

  要配置這樣的API,您首先應用所選的認證插件,而後建立一個新的consumer來表示匿名用戶,而後配置你的身份驗證插件以容許匿名訪問。這裏有一個示例,它假設您已經配置了一個名爲example-api的API:

  一、建立example-api:

$ curl -i -X POST \
  --url http://localhost:8001/apis/ \
  --data 'name=example-api' \
  --data 'uris=/auth-sample' \
  --data 'upstream_url=http://mockbin.org/request' 

    此時,不管什麼樣的請求,http://localhost:8000/auth-sample 都會有輸出信息。

  二、配置 key-auth 插件:

$ curl -i -X POST \
  --url http://localhost:8001/apis/example-api/plugins/ \
  --data 'name=key-auth'

  三、驗證 key-auth 插件是否正確配置:

$ curl -i -X GET \
  --url http://localhost:8000/auth-example

    此時,因爲你並未在請求參數或請求頭裏使用apikey,因此這個請求會報403錯誤:

HTTP/1.1 403 Forbidden
...

{
  "message": "No API key found in headers or querystring"
}

  四、建立一個匿名consumer:

    每一次的KONG的代理請求,都會有一個對應的consumer對象。這裏建立一個anonymous_consumer來測試API的匿名請求:

$ curl -i -X POST \
  --url http://localhost:8001/consumers/ \
  --data "username=anonymous_users"

    你會獲得如下的返回信息:

HTTP/1.1 201 Created
Content-Type: application/json
Connection: keep-alive

{
  "username": "anonymous_users",
  "created_at": 1428555626000,
  "id": "bbdf1c48-19dc-4ab7-cae0-ff4f59d87dc9"
}

  五、開啓API的匿名請求:

    您如今將從新配置密鑰驗證插件,以容許匿名訪問:

$ curl -i -X PATCH \
  --url http://localhost:8001/apis/example-api/plugins/4a223b63-c44a-40e5-9102-b23335f594ca \
  --data "config.anonymous=bbdf1c48-19dc-4ab7-cae0-ff4f59d87dc9"

    這裏的兩個uuid,分別是第2步和第4步中產生的uuid。具體請參考兩步操做中返回參數id。

    config.anonymous = <consumer uuid>參數表示該API上的密鑰驗證插件容許匿名訪問,並將此訪問與上一步中收到的consumer的ID相關聯。在此步驟中,您須要提供有效的consumerID - 當進行匿名配置時,不會對consumer的id進行檢驗,若是配置了一個不存在的或錯誤的consumerid,則會致使插件不能正常運行。

  六、驗證匿名訪問:

$ curl -i -X GET \
  --url http://localhost:8000/auth-sample

    這個訪問請求和第三步中的同樣,然而,此時的訪問是經過的,只由於你在第五步中配置了匿名訪問。返回內容大體是:

{
  ...
  "headers": {
    ...
    "x-consumer-id": "713c592c-38b8-4f5b-976f-1bd2b8069494",
    "x-consumer-username": "anonymous_users",
    "x-anonymous-consumer": "true",
    ...
  },
  ...
}

    這顯示,請求經過了,而且是以匿名的方式。

 

多重驗證

  Kong 0.10.x擴展了爲給定API應用多個驗證插件的能力,並容許不一樣的客戶端使用不一樣的身份驗證方法來訪問給定的API服務。在評估多個身份驗證憑據時,能夠將驗證插件的行爲設置爲邏輯AND或邏輯OR。該行爲的關鍵是配置config.anonymous屬性。

  · config.anonymous 默認爲未設置。若是此屬性未設置(空),則auth插件將始終執行身份驗證,並返回40x響應(若是未驗證)。當調用多個驗證插件時,會致使邏輯AND。

  · config.anonymous 設置爲有效的consumer ID。在這種狀況下,auth插件只有在還沒有認證的狀況下才會執行身份驗證。當身份驗證失敗時,它不會返回40x響應,而是將匿名consumer設置爲consumer。當調用多個驗證插件時,會使用OR+匿名。

 

備註1:全部的或任何一個驗證插件均可配置爲可以使匿名訪問的。可是,若是要混合使用驗證插件,則對於匿名訪問的配置就須要進行甄選,不然會出現混亂。

備註2:若是使用AND邏輯,則最後一個執行的驗證插件將是把驗證信息傳遞給上游服務的那個。當使用OR邏輯時,傳遞給上游服務驗證信息的那個插件,將會是第一個成功驗證consumer的那個插件,或者是最後一個配置了匿名訪問權限的那個插件。

ps:若是對API使用多個驗證插件,且插件間的邏輯配置爲OR的話,最好不要爲每一個插件開啓匿名訪問,這樣才能保證最終能成功請求的consumer是預期的那個。不然會有不可預期的結果出現。

相關文章
相關標籤/搜索