lua
因为决定学习开发网关kong的插件,所以需要学习lua语言,正在从Lua 菜鸟教程学习
关于kong插件开发的博客 链接1
发现一个很有意思的lua 模块 :openresty 的lua-resty-template 模块,提供模板渲染的功能
准备在网关处进行对于token的检验工作,由于没有使用已有的oauth server 插件,所以需要自己写个额外插件
在这个插件中主要需要完成的工作是从cookie 中 提取出 token ,并以此为凭借到oauth server 进行相关检验,如果检验成功,应当返回id 以及这个token的ttl ,网关处获得id 应当 将之体现在日志里(插件逻辑处新建header,在nginx日志处自定义日志格式,指明该id或者在网关处建立与oauth server相同的用户体系,起码账户名一致,这样根据id 可以从数据库中提取出相应的consumer credential ,这样的话可以用于后续的基于用户的限流等操作)
主要点在于1.Lua中进行http 操作 ,Github 源码文档
2.考虑对token进行缓存,[‘token’,’id’,ttl],这样无需多次存取(可能带来的问题有,注销登录后如何通知网关注销token:这又分为两种注销后不再登录和重新登陆,对于后者可以下次请求经过网关时,注销相同id的键值对)
Github lua-resty-redis
Kong rate-limiting 插件中涉及对于redis的操作,可以观摩下
目前在网关处验证用户身份成功后,在后端为避免再次检验身份的需要,因此需要网关提供给后端身份凭据,认可这次身份凭据,同时应当提供某种验证手段,让后端验证请求是否身份凭据是否是真的/是否是伪造
方案1 :利用某种对称加密算法,网关对用户身份进行加密,后端以相同的密钥进行解密,得到身份
确定使用AES算法Github 示例,在网关处使用CBC加密,相同的偏移向量,结果转化为hex格式,传输到python后端,对结果转发,解密,但是解密始终得不到正确的结果,怀疑是博客中提到的问题,但是我在测试中设置的加密字段,加密密钥,偏移向量都是16位的,看起来应该不会有填充的问题才对,但是解密仍然失败
方案2 :采取非对称加密算法,在网关处向后端传递两个header:userid,encrypted 在网关处按照某种方法加密得到 encrypt header,后端使用同样的方法加密,如果结果相同,则认为 userid 经过了网关的认证,同时加密内容应当是网关与后端之间相互约定的动态的内容
2020-1-10 代码更新,把硬编码信息改为插件的配置输入
curl -i -X POST http://localhost:8001/plugins
–data “name=kong-plugin-myplugin”
–data “config.sso_domain=SS0_DOMAIN”
–data “config.check_path=CHECK_PATH”
–data “config.front_domain=FRONT_DOMAIN”
–data “config.client=CLIENT_JSON”
其中需要注意的是,kong网关对于插件配置的输入中对于字符 ‘&’ 的支持不好,而使用’&’的话,网关处接收后会转化为’\&’,看起来很不舒服,然后我 使用 ‘a’ 字符代表 ‘&’,在插件处理逻辑处再替换回来(需要注意的是如果单个的’'存在,会影响 string 转化为 json)