Kong支持同时启用多个身份认证(Auth)插件,允许客户端使用不同的身份验证方法来访问指定的服务(Services)或路由(Routes)。
创建一个消费者
创建消费者
创建消费者 devops
1  | $ curl -X POST --url http://localhost:8001/consumers/ --data "username=devops"  | 
生成key-auth认证秘钥
为消费者 devops生成秘钥凭证,可以指定key值,也可以让插件自动生成key值,建议插件自动生成
1  | $ curl -X POST --url http://localhost:8001/consumers/devops/key-auth/  | 
可以通过接口/key-auths查看所有消费者的秘钥,通过/consumers/{consumer}/key-auth接口查看指定消费者的秘钥。
生成JWT凭证
1  | $ curl -X POST http://localhost:8001/consumers/devops/jwt \  | 
可以通过/jwts接口查看所有消费者的jwt凭证,通过/consumers/{consumer}/jwt接口查看指定消费者的凭证。
启用多个认证插件
插件可以应用于Route,Service,Global,这里以Global为例。并同时启动key-auth和jwt认证插件。
启用key-auth认证插件
1  | $ curl -X POST --url http://localhost:8001/plugins/ --data "name=key-auth"  | 
启用jwt认证插件
1  | $ curl -X POST --url http://localhost:8001/plugins/ --data "name=jwt"  | 
多重认证-AND
Kong启用多个认证插件后,默认的执行逻辑是 AND。例如启用了两个认证插件key-auth和jwt,那么每次的请求必须提供这两个插件的认证信息,必须通过所有认证插件的认证,才会将下游的请求转发到上游。
使用key-auth 认证方式,请求状态401,返回jwt插件的未认证信息提示{"message":"Unauthorized"}
1  | $ curl -i -X GET --url http://192.168.1.100:8000/api/test/ \  | 
使用 jwt 认证方式,请求状态401,返回key-auth插件的未认证信息提示{"message":"No API key found in request"}
1  | $ curl -i -X GET --url http://192.168.1.100:8000/api/test/ \  | 
同时使用key-auth和jwt 认证方式,成功返回请求数据,请求状态200
1  | $ curl -i -X GET --url http://192.168.1.100:8000/api/test/ \  | 
多种认证-OR
Kong启用多个认证插件后,默认的执行逻辑是 AND,当认证插件都启用匿名访问后,执行逻辑将会变为 OR。
在不启用匿名访问的时候,
auth插件将始终执行身份验证,如果未经过验证,则返回40x响应。当启用匿名访问后auth插件只会在未经过身份验证的情况下执行身份验证,如果身份验证失败,它不会返回40x响应,而是将匿名使用者设置为有效的消费者,那么当调用多个auth插件时,就会导致OR + 匿名访问的逻辑。如果配合request-termination plugin插件拦截匿名访问的请求,禁止匿名访问,就可以达到多种认证OR的效果。
创建匿名消费者
1  | $ curl -X POST --url http://localhost:8001/consumers/ \  | 
启用匿名访问
key-auth插件启用匿名访问,插件id为947db416-1f3a-4a54-a5ff-75b6a55206d7,匿名用户id为958e85d7-e39d-4d2c-b8a9-888e25dbeed5
1  | $ curl -X PATCH --url http://localhost:8001/plugins/947db416-1f3a-4a54-a5ff-75b6a55206d7/ \  | 
jwt插件启用匿名访问,插件id为fc54429b-73cd-4215-8f4d-35a21c6a389e,匿名用户id为958e85d7-e39d-4d2c-b8a9-888e25dbeed5
1  | $ curl -X PATCH --url http://localhost:8001/plugins/fc54429b-73cd-4215-8f4d-35a21c6a389e/ \  | 
启用匿名访问后,请求将不需要认证
1  | $ curl -i -X GET --url http://192.168.1.100:8000/api/test/  | 
拦截匿名请求
启用request-termination插件
1  | $ curl -X POST http://localhost:8001/plugins/ \  | 
匿名消费者anonymous启用该拦截插件,插件id为e5ff19cf-006d-4fcd-ae00-5837bc5d6938,匿名消费者id为958e85d7-e39d-4d2c-b8a9-888e25dbeed5
1  | $ curl -X PATCH http://localhost:8001/plugins/e5ff19cf-006d-4fcd-ae00-5837bc5d6938/ \  | 
此时匿名请求已被拦截
1  | $ curl -i -X GET --url http://192.168.1.100:8000/api/test/  | 
但是只要通过任一种验证,即可成功请求数据
1  | # key-auth  | 
此时的多认证插件(Auth)执行逻辑是 OR