Kong + Oauth 密码模式设计
2018-11-06 本文已影响82人
GoddyWu
资料
- 本文涉及代码地址:https://gitlab.com/goddy-test/public/kong
- 接口文档:https://documenter.getpostman.com/view/4234097/RzZ6Jfxj
- kong的介绍:https://www.jianshu.com/p/358888f2d706
- kong+oauth2 postman的使用:https://www.jianshu.com/p/814a5307632b
- kong+dashboard的使用:https://www.jianshu.com/p/a490dba6edfd
- kong+oauth2 四种登录方式的时序图:https://www.jianshu.com/p/81289dfd8205
图解流程
kong 官方密码模式的流程图
![](https://img.haomeiwen.com/i7691672/26882d2f4a78c938.png)
图中可见,kong的官方设计是需要我们自己开发一个backend(后端)项目,来做客户端与kong中间层,用于拼接完整的oauth请求信息并请求至kong。但是这里的webapp backend是没有被kong管理起来的,它也需要kong来提供管理服务,理想设计为下图。
本文设计的流程图
原图在资料第一条仓库中
![](https://img.haomeiwen.com/i7691672/f42f254685575c8c.png)
图例:(线段是对应颜色节点的行为)
- 绿色client application: 客户端,前端项目
- 黄色kong: kong + kong dashboard
- 蓝色webapp backend: 待开发的用户验证服务,需要连接用户数据库
- 紫色resource service: 资源服务
webapp backend 搭建
backend需要做的:
- 步骤1: 验证用户输入的用户名、密码(如果用户提供的手机号或者其他信息,需要转为步骤2所需要的信息)
- 步骤2: 拼接完整的信息,请求kong的oauth服务
- 步骤3: 返回kong返回它的token信息
下图是一个简单版本的backend,去除了和数据库的交互。
注:这里使用的flask框架
![](https://img.haomeiwen.com/i7691672/4f5a71c78729daf6.png)
字段数据的来源:
- grant_type: 固定写死password
- client_id、client_secret、provision_key: 在kong中注册得来
- username、password、authenticated_userid、scope: 用户数据库存储的
构建流程
1.docker-compose启动服务
参考:https://github.com/Kong/docker-kong/tree/master/compose
version: '2.1'
services:
kong-database:
image: postgres:9.5
environment:
- POSTGRES_USER=kong
- POSTGRES_DB=kong
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 30s
timeout: 30s
retries: 3
restart: on-failure
kong:
image: kong:latest
command: kong start --run-migrations
depends_on:
kong-database:
condition: service_healthy
healthcheck:
test: "kong health"
interval: 10s
timeout: 5s
retries: 5
environment:
- KONG_DATABASE=postgres
- KONG_PG_HOST=kong-database
- KONG_PG_DATABASE=kong
- KONG_ADMIN_LISTEN=0.0.0.0:8001
ports:
- "8000:8000"
- "8001:8001" # 后续需要加密
- "8443:8443"
- "8444:8444" # 后续需要加密
restart: on-failure
kong-dashboard:
image: pgbi/kong-dashboard
depends_on:
kong:
condition: service_healthy
entrypoint: ./docker/entrypoint_dev.sh
ports:
- "8081:8080" # 后续需要加密,可以不使用
kong-backend:
image: godbaby/kong-python:1.0
volumes:
- "/Users/goddy/test/kong/docker/app.py:/code/app.py" # 方便测试
ports:
- "3000:5000" # 这里不需要暴露,只是方便调试
kong-resource:
image: godbaby/kong-python:1.0
volumes:
- "/Users/goddy/test/kong/docker/resource.py:/code/app.py" # 方便测试
ports:
- "3001:5000" # 这里不需要暴露,只是方便调试
2.构建kong管理服务
- 构建backend的service+route
- 构建resource的service+route
- 对backend加rate-limiting plugin
- 对resource加oauth2 plugin
详情见接口文档:https://documenter.getpostman.com/view/4234097/RzZ6Jfxj
注:这里也可以使用kong dashboard来操作。
3. 访问资源
- 通过kong访问backend获取token、refresh token
- 通过kong+token访问resource
- 通过kong+refresh token获取token、refresh token