简介
传入用户 upstream service 的流量(API或者微服务)通常受应用和Kong各种鉴权插件控制,由于Kong的服务实体与用户的 upstream service 是一一对应的,所以比较简单的方案是直接在服务上配置鉴权插件
通用身份认证
通常情况下,用户需要添加鉴权功能,并且不允许任何未经鉴权的请求访问,用户可以使用任一鉴权插件实现这项功能,流程如下所示:
- 在服务上添加一个鉴权插件,或者全局添加;
- 创建一个消费者实体;
- 为消费者提供鉴权方法需要的鉴权凭证;
- 现在当请求进入Kong之后,都会校验提供的凭证,如果请求校验失败,Kong会阻断该请求;校验成功后会将消费者和凭证信息加入请求头并转发请求;
上面的通用流程不是每一步都是必须的,比如在使用LDAP等外部身份验证时,不会识别任何消费者,请求头中只会添加凭证信息,具体验证细节和示例可以在每个插件的各自文档中找到
消费者
消费者这个概念简单理解起来可以和用户一一对应,消费者的核心原则是用户可以在上面附加插件,并定制请求行为,用户可能有多个手机应用,用户可以对每一个应用,或每一个版本,或每一个平台(比如安卓、IOS)定义一个消费者
匿名接入
Kong可以使服务同时满足鉴权接入和匿名接入,用户可能会对鉴权接入和匿名接入提供不同的限流策略
要配置这样的服务,首先需要使用鉴权插件,然后创建一个新的消费者来表示匿名用户,然后配置鉴权插件允许匿名接入,以下是配置流程:
创建示例服务和路由
发送下列指令创建 example-service
,这个服务指向 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会回显任何请求
在服务上配置key-auth插件
发送下列指令在服务上添加一个插件:
curl -i -X POST --url http://localhost:8001/services/example-service/plugins/ --data 'name=key-auth'
注意记录插件的id,我们会在后续用到
验证key-auth插件是否已配置
发送下列指令,验证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"
}
创建一个匿名消费者
Kong代理每个请求必须与消费者关联,所以可以通过发送下列指令创建一个名字为 anonymous_users
的消费者
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"
}
注意记录消费者的id,我们会在后续用到
启用匿名接入
用户现在可以重新配置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>
参数表示此服务上的key-auth插件允许匿名访问,并关联到之前配置的消费者上,在配置时需要预先存留的id,Kong会检验id的有效性,输入不存在的id会导致不正确的配置
检测匿名接入是否生效
发送下列指令,检测匿名接入是否生效:
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支持对服务添加多重身份认证,允许不同的客户端使用不同的鉴权方法接入服务,鉴权插件可以根据 与或
逻辑结合,这些通过 config.anonymous
属性配置
- 没有设置
config.anonymous
如果该属性为空,那么鉴权插件永远会执行鉴权操作,如果未经验证,就会返回40X
响应,当有多个插件时,它们之间是与
逻辑 - 设置了
config.anonymous
这种情况下鉴权插件只会在尚未经过鉴权的情况下执行鉴权,当鉴权失败后,不会返回40X
响应,而是使用匿名消费者,多个插件之间是或
逻辑
注1:鉴权插件只能 全部
或者 全不
配置匿名接入,如果混合配置,结果是不确定的
注2:当使用 与
逻辑时,最后一个匹配的插件的凭证信息会传入 upstream service;当使用 或
逻辑时,第一个匹配的插件的凭证信息或者最后一个插件的匿名消费者会传入 upstream service
注3:当以 与
逻辑与其他插件共用 OAuth2 插件时,用户请求令牌的 OAuth2 端点也需要其他已配置的鉴权插件的身份校验
网友评论