本篇是关于API网关Kong的基本命令行使用以及UI管理界面Konga的基本使用。
前半部分主要使用CLI进行kong设定,实际使用可以直接使用konga在UI界面进行设定。前半部分可以跳过,直接看konga的基本使用
查看节点状态
curl http://localhost:8001/status
配置实例
创建Service
curl -i -k -X POST --url http://localhost:8001/services/ --data 'name=baidu-service' --data 'url=https://www.baidu.com/'
创建route
curl -ik -X POST --url http://localhost:8001/services/baidu-service/routes --data 'hosts[]=con-baidu.com' --data 'paths[]=/api/baidu'
连接测试
curl -k http://localhost:8000/api/baidu --header 'Host: con-baidu.com'
以上测试没有做任何鉴权处理,任何来的请求都会被响应。接下来会做认证
插件
JWT
JWT插件目的是保护API只能被授信用户访问,未授信用户将返回未授权信息。
- 取得route的id
curl -i -X GET http://localhost:8001/services/baidu-service/routes
- 返回结果
{"next":null,"data":[{"id":"13cda1d6-3b8a-4e67-9103-6e4843e8d469","tags":null,"updated_at":1575548207,"destinations":null,"headers":null,"protocols":["http","https"],"created_at":1575548207,"snis":null,"service":{"id":"4b924b6f-d1f8-475b-93b7-a2ae396c998e"},"name":null,"preserve_host":false,"regex_priority":0,"strip_path":true,"sources":null,"paths":["\/api\/baidu"],"https_redirect_status_code":426,"hosts":["con-baidu.com"],"methods":null}]}
其中id对应的结果“13cda1d6-3b8a-4e67-9103-6e4843e8d469”就是我们需要的route id
- 在route上创建plugin
curl -X POST http://localhost:8001/routes/13cda1d6-3b8a-4e67-9103-6e4843e8d469/plugins --data "name=jwt"
其中“13cda1d6-3b8a-4e67-9103-6e4843e8d469”是之前建立的route的id
- 再次连接测试
curl -k http://localhost:8000/api/baidu --header 'Host: con-baidu.com'
response
{"message":"Unauthorized"}
所以JWT已经生效
consumer
- 创建用户
curl -i -X POST --url http://localhost:8001/consumers/ --data "username=binTester"
- 查看
curl -i -X GET --url http://localhost:8001/consumers
- 返回结果
HTTP/1.1 200 OK
Date: Thu, 05 Dec 2019 13:02:03 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.4.0
Content-Length: 144
X-Kong-Admin-Latency: 1
{
"next":null,
"data":[{
"custom_id":null,
"created_at":1575550749,
"id":"aafaa4e0-2e39-45cb-83fd-6406dca211b1",
"tags":null,
"username":"binTester"}]}
生成JWT凭证
-
命令
curl -i -X POST --url http://localhost:8001/consumers/binTester/jwt --header "Content-Type: application/x-www-form-urlencoded"
-
确认
curl -i -X GET --url http://localhost:8001/consumers/binTester/jwt
-
返回结果
{ "next":null, "data":[{ "rsa_public_key":null, "created_at":1575551140, "consumer":{ "id":"aafaa4e0-2e39-45cb-83fd-6406dca211b1" }, "id":"908cb301-bfdf-4297-b858-de5503a564a8", "tags":null, "key":"ZGcfirIUbEkD6TRiEmScGjHI2UB6Fp5F", "secret":"vXKwnBGkqfhkhdOPLPSMeLKjah422GH7", "algorithm":"HS256" }
- 确认测试
访问 https://jwt.io/ 生成jwt的凭证信息
将encoded的内容copy,使用postman进行测试
header中添加Host内容
发送send收到baidu的回复
ACL
ACL插件可以对授信用户进行分组访问授权API服务。例如userA加入VIP group,userA就可以访问VIP的商品信息API服务。 userB只是普通group,所以userB访问VIP商品信息API接口就会提示不能访问这个服务(You cannot consume this service)
- 在定义好的route上启用ACL插件,指定白名单
curl -i -X POST --url http://172.17.84.204:8001/routes/13cda1d6-3b8a-4e67-9103-6e4843e8d469/plugins --data "name=acl" --data "config.whitelist=allow-normal-group"
- 确认测试
使用postman将之前的请求再次发送,返回结果"You cannot consume this service"
- 添加用户到group
curl -i -X POST --url http://172.17.84.204:8001/consumers/binTester/acls --data "group=allow-normal-group"
再次使用postman将之前的请求发送,正确返回response
key-auth
key-auth的plugin可以应用在service或route上
最简单的实际应用场景,对某个服务设置key-auth,只有获得了词key-value认证的请求才能够被访问,其他无此认证信息的请求都会被拒绝。防止服务被盗刷
konga安装使用
- pgsql提前准备
create user konga with password 'konga123';
create database konga with encoding='UTF8' owner konga;
- 运行docker
docker run -p 1337:1337 --name konga -e "NODE_ENV=production" -e "DB_ADAPTER=postgres" -e "DB_HOST=172.17.84.204" -e "DB_USER=konga" -e "DB_PASSWORD=konga123" -e "DB_DATABASE=konga" pantsel/konga
- 注册
- 设置
- 生成service
- 生成route
- postman请求测试
可以看到我们请求kong的/key/authtest实际调用的是mockbin.org/doc
key-auth
keyauth可以用在service上也可以用在route上。
本例我们用在上面我们建立的route上。
接下来生成consumer->Credentials->API KEYS->CREATE API KEY输入键值
现在我们使用之情的请求访问服务时会失败,提示"No API key found in request"
接下来设定API key
可正常访问
basic auth
在service或route上创建basic auth
IP地址限定
在service或route上添加IP restriction的plugin
white list设置一个非postman运行主机的ip
postman访问失败提示"Your IP address is not allowed"
Bot detection
对service或route创建 bot-detection可以根据User-agent对请求分类到黑名单或白名单。
将User-Agent为kong-botdetection加入黑名单
在postman中将请求的User-Agent设为kong-botdetection发送请求可以看到返回Fobidden消息
rate limiting
可以对service或route通过添加Rate Limiting的plugin进行流量控制。流量为秒/分/时/日/月/年的访问次数。
设置1次/秒
超过这个频率会返回API rate limit exceeded错误信息
request size limiting
对请求的payload size进行设定。设定是以M为单位的
使用postman发送大雨1M的请求会返回Request size limit exceeded