Kong技术调研&curl简介

jopen 9年前

Kong

Kong是一款开源的API网关,基于Lua和Cassandra,支持分布式操作,有很强的可移植性和可扩展性。作为应用和API之间的中间层,加上众多功能强大的插件,可以实现认证授权、访问控制等功能;

  • 本文讨论授权时的一般流程和基本使用:
    • kong前加上一层web后台对应consumer,包括终端用户的创建,一个consumer相当于一个注册的应用;
    • 对于每一个用户,第三方认证成功后,后台得到用户信息,后台将用户信息提交给kong验证对应的API, 得到token;
    • 对于每一个用户和每一个API都有一个access_token,通过consumer授权;
    • 利用authorization_userid对应终端用户;
    </li>
  • 项目主页
  • </ul>

    一般流程, 授权:

    1. 进入网站后,判断未登陆用户, 引导到第三方登陆平台;
    2. 在第三方登陆平台登陆并授权, 返回code, 本地利用 code 请求得到token(此时授权成功), 再利用token得到用户个人信息(公开信息), 用于创建本地用户;
    3. 用户要访问某个api信息时,由web后台利用用户uid(或其他的唯一标识)来请求授权,并获得对应的token(具体流程同oauth2),凭借token访问api;

    前期:

    • 为 kong 实例 add api;

      api信息  {      "public_dns":"mockbin.com",      "id":"01bac53d-814f-4cff-cc86-438e5a55f50b",      "target_url":"http:\/\/mockbin.com\/bin\/974b6f74-9d3c-430a-8957-baace2e44d0b",      "created_at":1438676467000,      "name":"AnKangDeRiChang_0x00"  }
    • 为 api 配置 oauth2 插件;此时会得到 privision_key(自动生成) 和 scope(手工配置)

    • 为 kong 实例建立consumer;

      curl -X POST http://localhost:8001/consumers/ \   --data "username=wangao" \   --data "custom_id=wangao"

      返回

      consumer信息  {      "consumer_id":"286edf35-9975-4c6e-ccc4-fff6ff5b6836",      "client_id":"78c0d1106e9845e0c5217afbe830553d",      "id":"f9f95714-e6db-473e-c724-0887130af34d",      "name":"Test_oauth2","created_at":1438766198000,      "redirect_uri":"http:\/\/ak.limijiaoyin.com\/",      "client_secret":"31fc46bd8be14754c7c046c72acff2e7"  }

      生成 client_id, client_secret;

    • 为用户配置 oauth2 服务;

    认证过程:

    • 请求 code

      curl -X POST http://localhost:8000/oauth2/authorize \   --data client_id=78c0d1106e9845e0c5217afbe830553d  \                    // from consumer  --data "response_type=code" \  --data "authenticated_userid=ankang_0x00" \                             //终端用户的id, 取值唯一, 可以采用在本地注册之后的uid, web后台提供  --data "provision_key=d9edf1d54de24d50cdbea1799133e76a" \   --data "scope=email,phone,address" \                                    //from oauth2 plugin of API  --header "Host: mockbin.com"
    • 请求 token

      curl -X POST http://localhost:8000/oauth2/token \  --data "code=d49e05b26fc14cb8cc61623fa63a43b6" \  --data "client_id=78c0d1106e9845e0c5217afbe830553d" \   --data "client_secret=31fc46bd8be14754c7c046c72acff2e7" \   --data "grant_type=authorization_code" \  --header "Host: mockbin.com"       {         "refresh_token":"50ff3a4a6eb64b9ccbb16543fd76d38d",      "token_type":"bearer",      "access_token":"170e6dcd8ffb4f18cf310dd53a051c9b",      "expires_in":7200  }
    • 利用 access_token 访问 API;

      curl -X GET http://localhost:8000?access_token=170e6dcd8ffb4f18cf310dd53a051c9b \  -- header "Host: mockbin.com"

    为一个用户存储对应 API 的 token 信息, 此时可以成功访问相应的 API;

    负载均衡

    在多个Kong实例之前加上一层nginx,所有都请求都发送到某一个端口,由这个端口的nginx服务进行分发,分发到各个实例,实现负载均衡;

    curl 命令的使用

    curl,简单的命令行http工具,用于发送各种http请求,利用的参数可以附带各种信息,辅助我们在web开发中进行高效测试;

    常用的一些参数:      -i              加上头部信息      -I              只查看头部信息      -o      -O      -X                指定动词  GET, POST, PUT 等      --data            添加数据, POST常用      --header           添加头部信息      --url      --user-agent    设置user_agent(伪造)      -F                 提交表单      -T                上传      还支持设置cookie、远程创建目录等功能
    • 一些例子
      • 提交表单
        curl -F "name=udvoid;type=text/foo" www.test.com或
        curl -F "file=@localfile;filename=nameinpost" www.test.com@可引用文件位置;
      • 下载文件
        curl test.com -o "index.html"(-O 选项使用原本的文件名)
      • 上传文件
        curl -T test.com/upload "{1.txt, 2.txt}"
      </li> </ul> 来自:http://blog.limijiaoyin.com/kongcurl-20150808