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