apigateway-kong(六)認證


  到上游服務(API或微服務)的流量通常由各種Kong認證插件的應用程序和配置來控制。由於Kong的服務實體(Service Entity)代表自己的上游服務的1對1映射,最簡單的方案是在選擇的服務上配置認證插件。

目錄

  • 通用認證
  • Consumers
  • 匿名訪問
    • 1. 創建示例Service和Route
    • 2. 為服務配置key-auth插件
    • 3.驗證key-auth插件是否配置正確
    • 4.創建匿名consumer
    • 5.啟用匿名訪問
    • 6.驗證匿名訪問
  • 多重驗證

通用認證

  最常見的情況是需要身份驗證,並且不允許訪問任何未經身份驗證的請求。要實現這一點,可以使用任何身份驗證插件。這些插件的通用方案/流程如下所示:

1.向一個API或全局添加AUTH插件(無法將其應用於Consumer)
2.創建一個Consumer實體
3.為Consumer提供特定驗證插件方案的身份驗證憑據
4.現在,每當有請求進入時,Kong將檢查提供的憑證(取決於auth類型),如果請求無法驗證,它將阻止該請求,或者在header中添加使用者和憑證詳細信息並轉發請求

上面的通用流程並不總是適用的,例如,當使用外部認證(如LDAP)時,則不會識別Consumer,只有憑證將被添加到轉發的標頭(forwarded headers)中。

在每個插件的文檔中都可以找到身份驗證方法的特定元素和示例

Consumers

  最簡單的理解和配置consumer的方式是將其於用戶進行一一映射,然而,對於這個並不重要。consumer的核心原則是你可以為其添加插件,從而自定義請求行為。所以你可能有移動APP,並為每個應用程序或其版本定義一個消費者。或者每個平台都有一個消費者,例如Android消費者,iOS消費者等。

這對Kong來說是一個不透明的概念,因此他們被稱為“消費者”而不是“用戶”。

匿名訪問

  在Kong 0.10.x版本之前,你可以將指定的API配置為僅允許經過身份驗證的訪問(通過插件來實現)或只允許匿名訪問。也就是說,一個指定的API,不允許對於某些consumer實行身份驗證,而對於另外的consumer實行匿名訪問。
  在0.10.x版本以后,這些限制取消了。Kong可以配置給定的服務(Service)以允許通過身份驗證和匿名訪問,你可以使用此配置為低速率限制的匿名用戶授予訪問權限,並向具有較高速率限制的已認證用戶授予訪問權限。

要這樣配置服務,您首先應用所選的身份驗證插件,然后創建一個新的Consumer來表示匿名用戶,然后配置您的身份驗證插件以允許匿名訪問。
這里是一個例子,假設你已經配置了一個名為example-service的Service和相應的Route:

1. 創建示例Service和Route

發出以下CURL請求來創建指向mockbin.org的example-service,它將響應請求:

$ 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'

url  http://localhost:8000/auth-sample 現在會回應正在請求的內容

2. 為服務配置key-auth插件

執行以下curl請求來向服務添加一個插件:

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

記住創建的插件id ,步驟5會用到。

3.驗證key-auth插件是否配置正確

發出下面curl請求驗證key-auth插件是否正確配置在服務上:

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

由於未在header或parameter指定所需的apikey,並且尚未啟用匿名訪問,所以響應應為403 Forbidden:

HTTP/1.1 403 Forbidden
...

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

4.創建匿名consumer

  由Kong代理的每個請求都必須與消費者關聯。現在您將創建一個名為anonymous_users的消費者(Kong將在代理匿名訪問時使用),方法是發出以下請求:

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

你將會看到類似下面的Response:

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

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

記住這個Consumer id, 后面的步驟將會用到。

5.啟用匿名訪問

現在將重新配置key-auth插件以允許通過發出以下請求來進行匿名訪問(將步驟2和4中的uuid值替換為以下示例uuids)

$ curl -i -X PATCH \
  --url http://localhost:8001/plugins/<your-plugin-id> \
  --data "config.anonymous=<your-consumer-id>"

config.anonymous = <your-consumer-id>參數表示本服務上的key-auth插件允許匿名訪問,並將此訪問與我們在上一步中收到的Consumer id相關聯。在此步驟中提供有效且預先存在的Consumer id - 在配置匿名訪問時,不會對consumer的id進行檢驗,如果配置了一個不存在的或錯誤的consumer id,則會導致配置錯誤插件不能正常運行。

6.驗證匿名訪問

通過發出以下請求確認您的服務現在允許匿名訪問:

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

這與步驟#3中做出的請求相同,但是這次請求應該成功,因為在步驟#5中啟用了匿名訪問。

Response 大致包含這些字段:

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

請求返回成功,但是是匿名訪問。

多重驗證

  Kong支持給定服務的多個身份驗證插件,允許不同的客戶端使用不同的身份驗證方法訪問給定的服務或路由。
在評估多個身份驗證憑證時,可以將auth插件的行為設置為執行邏輯AND或邏輯OR。該行為的關鍵是配置config.anonymous屬性。

  • config.anonymous默認未設置,如果此屬性未設置(空),則驗證插件將始終執行驗證,如果未驗證,則返回40x響應。當多個auth插件被調用時,這會導致邏輯AND。
  • config.anonymous 設置為有效的consumer ID。在這種情況下,auth插件只有在尚未認證的情況下才會執行身份驗證。當身份驗證失敗時,它不會返回40x響應,而是將匿名consumer設置為consumer。當調用多個驗證插件時,會使用OR+匿名。

 

note1:所有的或任何一個驗證插件都可配置為可使匿名訪問的。但是,如果要混合使用驗證插件,則對於匿名訪問的配置就需要進行甄選,否則會出現混亂。

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

note3:當以AND方式使用OAuth2插件時,用於請求token等的OAuth2端點也需要其他配置的auth插件進行身份驗證。

 

注意:

當在給定服務上以OR方式啟用多個身份驗證插件並且希望匿名訪問被禁止時,則應該在匿名消費者上配置request-termination插件,不然會允許未經授權的請求。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM