Kong + Oauth 密码模式设计

资料

图解流程

kong 官方密码模式的流程图


图中可见,kong的官方设计是需要我们自己开发一个backend(后端)项目,来做客户端与kong中间层,用于拼接完整的oauth请求信息并请求至kong。但是这里的webapp backend是没有被kong管理起来的,它也需要kong来提供管理服务,理想设计为下图。

本文设计的流程图

原图在资料第一条仓库中


图例:(线段是对应颜色节点的行为)

  • 绿色client application: 客户端,前端项目
  • 黄色kong: kong + kong dashboard
  • 蓝色webapp backend: 待开发的用户验证服务,需要连接用户数据库
  • 紫色resource service: 资源服务

webapp backend 搭建

backend需要做的:

  • 步骤1: 验证用户输入的用户名、密码(如果用户提供的手机号或者其他信息,需要转为步骤2所需要的信息)
  • 步骤2: 拼接完整的信息,请求kong的oauth服务
  • 步骤3: 返回kong返回它的token信息

下图是一个简单版本的backend,去除了和数据库的交互。
注:这里使用的flask框架

java(reactor)版本的backend也在代码库中: https://gitlab.com/goddy-test/public/kong/blob/master/bot-auth/docker-compose.yml。有一个坑: https://stackoverflow.com/questions/7648872/can-i-override-the-host-header-where-using-javas-httpurlconnection-class。 以及java解析权限的示例项目:https://gitlab.com/goddy-test/public/kong/tree/dev/demo-resource

字段数据的来源:

  • 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管理服务

注:这里也可以使用kong dashboard来操作。

3. 访问资源

  • 通过kong访问backend获取token、refresh token
  • 通过kong+token访问resource
  • 通过kong+refresh token获取token、refresh token
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Kong 是 Mashape 开源的高性能高可用 API 网关和 API 管理服务层。它基于 OpenResty ...
    meng_philip123阅读 9,133评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    wgl0419阅读 6,359评论 1 9
  • 《你所谓的稳定不过是浪费生命》速读脑图
    金桔芒果阅读 135评论 0 0
  • 意气少年闲聊 画面有如清风 外面窗雨淅沥 原来周公夜曲
    蓝色后天阅读 231评论 0 0