环境采用官方docker镜像
因为公司用户授权使用jwt,本文是针对jwt做的一些研究
环境这里只写命令不做过多介绍,详细请看 官方文档
#拉取镜像
docker pull kong/kong-gateway:2.3.3.2-alpine
#标记镜像方便使用
docker images
docker tag <IMAGE_ID> kong-ee
#创建kong网关网卡
docker network create kong-ee-net
#启动数据库
docker run -d --name kong-ee-database \
--network=kong-ee-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6
#准备Kong数据库
docker run --rm --network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PASSWORD=<SOMETHING-YOU-KNOW>" \
kong-ee kong migrations bootstrap
#使用Kong Manager启动网关
docker run -d --name kong-ee --network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
-e "KONG_ADMIN_GUI_URL=http://<DNSorIP>:8002" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
-p 8002:8002 \
-p 8445:8445 \
-p 8003:8003 \
-p 8004:8004 \
kong-ee
到此环境配置完毕,由于使用的是免费版,官方插件库收费的不能使用
检验安装是否正确
curl -i -X GET --url http://<DNSorIP>:8001/services
#HTTP/1.1 200 OK
访问 http://DNSorIP:8002 这是一个可视化界面,不做过多介绍
由于是免费版,我们大部分操作都将是使用kong-admin-api添加配置
如何添加一个服务并代理
要注意端口的使用
kong是nginx+lua实现,api网关本质上是单一入口做代理到各个服务,从而达到对接口的管控如负载均衡,限流,权限等
请求工具这里我采用的是httpie也可使用curl,并且是在mac本地环境
添加服务
- http POST :8001/services name=example_service url=’项目地址’
- http :8001/services/example_service
ps项目地址可以是http://**.com/**,这样的好处是可以根据接口前缀更细粒度的管控权限
添加代理路由
- http :8001/services/example_service/routes paths:='["/mock"]' name=mocking
验收成果
访问 http :8000/mock 即为访问 添加服务标签内的项目地址
下面将进入jwt插件的使用
由于官方文档并不符合我想要的需求,我的需求是,代理到上游的时候头部文件要将jwt:payload_data内如用户id解析出来放入header内,显然需要自定义插件或者修改官方插件两个办法
看官方jwt插件源码
- claims为jwt:payload_data的解析结果
- 红框内就是自定义添加header的代码
自定义开发
由于是容器内须注意,docker exec 需指定root用户
使用luarocks开发lua组件包
github.com/luarocks/luarocks/wiki/...
luarocks组件库的jwt-header实例
github.com/yesinteractive/kong-jwt...
调试可在容器内运行kong reload,通过请求查看,暂未找到简易的调试办法
有待完善,尽作为笔记使用,可互相交流