本篇是关于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的凭证信息
发送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"
可正常访问
basic auth
IP地址限定
在service或route上添加IP restriction的plugin
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进行流量控制。流量为秒/分/时/日/月/年的访问次数。
超过这个频率会返回API rate limit exceeded错误信息