Kong技术调研&curl简介
jopen
9年前
Kong
Kong是一款开源的API网关,基于Lua和Cassandra,支持分布式操作,有很强的可移植性和可扩展性。作为应用和API之间的中间层,加上众多功能强大的插件,可以实现认证授权、访问控制等功能;
- 本文讨论授权时的一般流程和基本使用:
- kong前加上一层web后台对应consumer,包括终端用户的创建,一个consumer相当于一个注册的应用;
- 对于每一个用户,第三方认证成功后,后台得到用户信息,后台将用户信息提交给kong验证对应的API, 得到token;
- 对于每一个用户和每一个API都有一个access_token,通过consumer授权;
- 利用authorization_userid对应终端用户;
- 项目主页 </ul>
- 进入网站后,判断未登陆用户, 引导到第三方登陆平台;
- 在第三方登陆平台登陆并授权, 返回code, 本地利用 code 请求得到token(此时授权成功), 再利用token得到用户个人信息(公开信息), 用于创建本地用户;
- 用户要访问某个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}"
- 提交表单