上游服务(api或微服务)的流量一般由各类Kong的authentication plugins的应用程序和配置控制。因为Kong的服务实体表示您本身的上游服务的一对一映射,因此最简单的场景是在您选择的服务上配置身份验证插件。android
最多见的场景是须要身份验证,不容许对任何未经身份验证的请求进行访问。要实现这一点,可使用任何身份验证插件。这些插件的通常方案/流程以下:json
上面的通用流并不老是适用的,例如在使用LDAP之类的外部身份验证时,就没有要标识的使用者,而且只在转发的头中添加凭证。api
在每一个插件的文档plugin’s documentation中均可以找到特定于身份验证方法的元素和示例。bash
对于consumer最简单的方法是将他们一对一地映射到用户。然而,这对KOng来讲并不重要。对于使用者来讲,核心原则是能够将插件附加到它们上,从而定制请求行为。你可能有移动应用,为每一个应用定义一个消费者,或它的版本。或者每一个平台都有一个消费者,例如android消费者、iOS消费者等等。app
对于Kong来讲,这是一个不透明的概念,所以他们被称为“consumers”,而不是“users”。curl
Kong可以配置给定的服务,以容许身份验证和匿名访问。您可使用此配置将访问权限授予具备较低速率限制的匿名用户,并将访问权限授予具备较高速率限制的通过身份验证的用户。微服务
要配置这样的服务,首先应用所选的身份验证插件,而后建立一个新的使用者来表示匿名用户,而后配置身份验证插件以容许匿名访问。下面是一个示例,它假设您已经配置了一个名为example- Service的服务和相应的路由:ui
发出如下cURL请求,建立example-service指向mockbin.org,该服务将响应该请求:url
$ 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:spa
$ 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.
发出如下cURL请求,将插件添加到服务中:
$ curl -i -X POST \ --url http://localhost:8001/services/example-service/plugins/ \ --data 'name=key-auth'
请务必注意建立的插件id——在步骤5中须要它。
发出如下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" }
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——您将在下一个步骤中须要它。
您如今将从新配置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将致使不正确的配置。
经过发出如下请求,确认您的服务如今容许匿名访问:
$ 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", ... }, ... }
它显示请求成功,可是是匿名的。
Kong支持针对给定服务的多个身份验证插件,容许不一样的客户机使用不一样的身份验证方法访问给定的服务或路由。
能够将身份验证插件的行为设置为逻辑与、逻辑或在评估多个身份验证凭据时执行。行为的关键是配置config.anonymous属性。
config.anonymous
not set 若是未设置此属性(空),则身份验证插件将始终执行身份验证,若是未验证,则返回40x响应。这将在调用多个auth插件时产生一个逻辑插件。
config.anonymous
set 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插件进行身份验证。
若是在给定的服务上以某种方式启用多个身份验证插件,而且但愿禁止匿名访问,那么应该在匿名使用者上配置请求终止插件。不这样作将容许未经受权的请求。