转载

Kong技术调研&curl简介

Kong

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

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

一般流程, 授权:

  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(伪造)  还支持设置cookie, 远程创建目录, 模拟表单提交等等功能  
正文到此结束
Loading...