我们知道 kong 的 admin api 是 rest api,意味着你可以通过 http 请求调用,同时意味着没有 gui,但是可以选择第三方的工具,比如 konga 、kong-dashboard 等,本文的主题是 konga,在阅读本文之前建议您先阅读 kong 开源微服务 API 网关 ,本文的内容和这篇的内容有一定关系,你可以理解为是它的中篇吧,中篇?不错,kong 会有一系列博文,我们进入主题。
konga 的介绍
首先,我们看看 konga 的介绍以及能做什么吧,github地址是:https://github.com/pantsel/konga ,官方的介绍是 不只是另外一款管理 kong admin api的gui,至于能做什么,可以归结如下:
- 管理 kong 所有的 admin api
- 管理多个节点的 kong
- 数据导入导出
- 监控 kong 节点以及 api
- 多用户支持
- 邮件提醒
看起来很不错的样子,关键是兼容性 ok,那么,我们看看如何安装吧。
konga 的安装和使用
安装可以用下面的命令:
docker run --network=host --name konga -e "NODE_ENV=production" -itd pantsel/konga
这里,development 可以改为 production,安装后 打开 http://localhost:1337 ,用户名为 admin 密码为 adminadminadmin,另外,这里的 kong-net 为我之前为 kong 创建的网络,具体请看 kong 开源微服务 API 网关 ,登陆进去后可以添加 连接,地址为 http://kong:8001 ,接着,你可以添加服务以及消费者并创建应用了,当然还可以添加 oauth2。
创建 service、routes、consumers
接下来,我们创建一个服务,api-ssyer,并用 local.ssyer.com 作为客户端访问的域名,而 kong 则代理到 web.ssyer.com,并添加消费者和创建应用。
首先,点击左侧的 service,接着点击 add new service,弹出来的窗口里,填写的是 proxy server 的信息,即你要代理到的地址,一般是内网地址,但是,只要你记得这里填写的信息是 被代理的服务器的信息就足够了,比如,要实现 访问 local.kpromise.top 时代理到 web.ssyer.com 那么,这里填写的信息是 web.ssyer.com 的。
创建完 service 后 进入这个 service 的详情页,然后点击 route,这里填写的信息是 暴露给终端用户的,比如 local.kpromise.top ,但是要记得,填写完后需要按回车确认,这个和上面的不太一样。现在,你可以通过local.kpromise.top 作为别名调用 web.ssyer.com 的api 了,不过,记得将local.kpromise.top写到你的hosts文件里,确保解析的是 127.0.0.1,route 创建完毕后,点击 plugins,然后添加插件,选择 oauth2,在弹出的窗口里 打开 mandatory scope、并在 scopes 里填写需要的权限,之后打开 global credentials 和 enable authorization cod 选项,并删除 provision key 里的 function,否则创建好之后 provision key 的值就是 function,感觉是 bug …添加插件后再调用 local.kpromise.top 发现输出是: {"error_description":"The access token is missing","error":"invalid_request"},不错,需要 oauth2了。
进行 oauth2 授权
现在,我们创建 consumer,点击左侧 consumer ,然后点击创建,随便输入 用户名和用户id即可,创建完成后进入其详情页,点击 credentials 我们添加 oauth2 验证,首先,点击 oauth2,接着点击 create credentials,弹出的窗口里,需要填写 应用名以及 授权后的跳转链接,创建完成后 点击 应用名旁边的 眼睛 你将看到 client_id 以及 client_secret 等信息。
现在我们 服务创建完毕了,并且添加了 oauth2 验证,并创建了消费者以及应用,那么,我们接下来进行 oauth2 授权,然后通过 access_token 访问 api
curl -X POST https://local.kpromise.top:8443/oauth2/authorize --data "client_id=wfXkVmQyw9e6SScTME8OU2Ik75jnY3xE" --data "response_type=code" --data "scope=userInfo" --data "authenticated_userid=kpromise" --data "provision_key=zm074CKz8peOz2f2xtvdWdRlPKLTJH7Q" --insecure
这里,client_id 是创建 consumer 后创建的应用的 client_id,而 provision_key 是在给服务添加 oauth2 插件时你填写的 provision key 或者自动生成的 provision key,这行命令的输出如下:
{"redirect_uri":"https:\/\/www.ssyer.com\/oauth2?code=eUYtcNk1DvoOD3iQUnjEDtuQ3e3YUbXE"}
这里的 code 就是 oauth2 生成的 code,接下来用 code 交换 access_token 以及 refresh_token
curl -X POST https://local.kpromise.top:8443/oauth2/token --data "client_id=wfXkVmQyw9e6SScTME8OU2Ik75jnY3xE" --data "client_secret=14Nncu2x5AQ3ourfisRS2TUCBVv4ydO9" --data "grant_type=authorization_code" --data "code=eUYtcNk1DvoOD3iQUnjEDtuQ3e3YUbXE" --insecure
输出:
{"refresh_token":"ozFW1ToPXhqGyt0V1rwj2HDfJ3DU5ekw","token_type":"bearer","access_token":"55kzSAk46yvvFlcKPTxOdWbUlGPiLnq5","expires_in":7200}
接下来,我们调用 api:curl -X GET https://local.kpromise.top:8443/tag/hotTag?access_token=55kzSAk46yvvFlcKPTxOdWbUlGPiLnq5
最终发现 正常返回,而 web.ssyer.com 这边收到的请求的 header 如下:
'X-Consumer-ID': 'd855a97b-f21b-4373-a94e-249595a6c1b4', 'X-Consumer-Username': '123456', 'x-authenticated-scope': 'userInfo', 'x-authenticated-userid': 'kpromise'
这里,kpromise 是关键,获取 code 的时候曾经 传递过 authenticated_userid ,这里的 kpromise 便是 authenticated_userid 的值。
通过以上短暂的介绍,我相信你已经入门,但是依旧有一些问题,比如证书,我们可是用 --insecure 的,正式环境这不可能哦,另外 access_token 当作参数传递,这也有问题吧。预知解决之道,请待我更新。