介紹
上游服務(api或微服務)的流量通常由各種Kong的authentication plugins的應用程序和配置控制。由於Kong的服務實體表示您自己的上游服務的一對一映射,所以最簡單的場景是在您選擇的服務上配置身份驗證插件。
通用認證
最常見的場景是需要身份驗證,不允許對任何未經身份驗證的請求進行訪問。要實現這一點,可以使用任何身份驗證插件。這些插件的一般方案/流程如下:
- 將身份驗證插件應用於服務,或全局(您不能將其應用於使用者)
 - 創建consumer實體
 - 為consumer提供特定身份驗證方法的身份驗證憑據
 - 現在,每當請求進入Kong時,它將檢查提供的憑證(取決於身份驗證類型),如果無法驗證,它將阻塞請求,或者在header中添加使用者和憑證詳細信息並轉發請求
 
上面的通用流並不總是適用的,例如在使用LDAP之類的外部身份驗證時,就沒有要標識的使用者,並且只在轉發的頭中添加憑證。
在每個插件的文檔plugin’s documentation中都可以找到特定於身份驗證方法的元素和示例。
消費者
對於consumer最簡單的方法是將他們一對一地映射到用戶。然而,這對KOng來說並不重要。對於使用者來說,核心原則是可以將插件附加到它們上,從而定制請求行為。你可能有移動應用,為每個應用定義一個消費者,或它的版本。或者每個平台都有一個消費者,例如android消費者、iOS消費者等等。
對於Kong來說,這是一個不透明的概念,因此他們被稱為“consumers”,而不是“users”。
匿名訪問
Kong能夠配置給定的服務,以允許身份驗證和匿名訪問。您可以使用此配置將訪問權限授予具有較低速率限制的匿名用戶,並將訪問權限授予具有較高速率限制的經過身份驗證的用戶。
要配置這樣的服務,首先應用所選的身份驗證插件,然后創建一個新的使用者來表示匿名用戶,然后配置身份驗證插件以允許匿名訪問。下面是一個示例,它假設您已經配置了一個名為example- Service的服務和相應的路由:
1、創建示例服務和路由
發出以下cURL請求,創建example-service指向mockbin.org,該服務將響應該請求:
 $ curl -i -X POST \ --url http://localhost:8001/services/ \ --data 'name=example-service' \ --data 'url=http://mockbin.org/request'  
        Add a route to the Service:
 $ curl -i -X POST \ --url http://localhost:8001/services/example-service/routes \ --data 'paths[]=/auth-sample'  
        The url http://localhost:8000/auth-sample will now echo whatever is being requested.
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  
        由於您沒有指定所需的apikey頭文件或參數,並且您還沒有啟用匿名訪問,因此響應應該是403禁止的:
 HTTP/1.1 403 Forbidden  ... { "message": "No API key found in headers or querystring" }  
        4、創建匿名consumer
Kong代理的每個請求都必須與一個consumer相關聯。現在,通過發出以下請求,您將創建一個名為anonymous_users的使用者(Kong將在代理匿名訪問時使用該使用者):
 $ curl -i -X POST \ --url http://localhost:8001/consumers/ \ --data "username=anonymous_users"  
        You should see a response similar to the one below:
 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插件,通過發出以下請求來允許匿名訪問(將下面的示例uuid替換為步驟2和步驟4中的id值):
 $ 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中啟用了匿名訪問。
響應(即Mockbin接收到的請求)應該包含以下元素:
 { ... "headers": { ... "x-consumer-id": "713c592c-38b8-4f5b-976f-1bd2b8069494", "x-consumer-username": "anonymous_users", "x-anonymous-consumer": "true", ... }, ... } 
        它顯示請求成功,但是是匿名的。
Multiple身份驗證
Kong支持針對給定服務的多個身份驗證插件,允許不同的客戶機使用不同的身份驗證方法訪問給定的服務或路由。
可以將身份驗證插件的行為設置為邏輯與、邏輯或在評估多個身份驗證憑據時執行。行為的關鍵是配置config.anonymous屬性。
config.anonymousnot set
如果未設置此屬性(空),則身份驗證插件將始終執行身份驗證,如果未驗證,則返回40x響應。這將在調用多個auth插件時產生一個邏輯插件。
config.anonymousset to a valid consumer id
在這種情況下,身份驗證插件只會在尚未驗證的情況下執行身份驗證。當身份驗證失敗時,它將不返回40x響應,而是將匿名使用者設置為使用者。當多個身份驗證插件被調用時,這將導致一個邏輯或+“anonymous access”。
注1:必須為所有auth plugin或全部都不配置anonymous access。如果它們是混合的,則行為是未定義的。
注2:在使用AND方法時,最后執行的插件將設置傳遞給上游服務的憑證。使用OR方法,最后傳遞上游服務憑證將是將是第一個成功驗證consumer的插件,或者最后一個plugin將是傳遞上游服務憑證,如果其已配置的anonymous consumer.。
注3:當以一種AND的方式同時使用OAuth2插件時,用於請求令牌的OAuth2端點等也需要通過其他配置的auth插件進行身份驗證。
如果在給定的服務上以某種方式啟用多個身份驗證插件,並且希望禁止匿名訪問,那么應該在匿名使用者上配置請求終止插件。不這樣做將允許未經授權的請求。
