Kong 集成 Jwt 插件

上一篇文章使用 Kong 完成了负载均衡的配置,本文介绍下在此基础上如何集成 jwt 插件来保护内部服务的安全。前置知识点:Jwt 基础概念。推荐阅读:

通俗易懂地介绍 Jwt https://blog.leapoahead.com/2015/09/06/understanding-jwt/

Jwt 的官网 https://jwt.io/

为 Kong 安装 Jwt 插件

Kong 官方提供了 Jwt 插件,可以对 某个 service 或者 route 添加 Jwt 认证,我以 service 为例介绍 Jwt 插件的使用

为 hello(上篇文章创建的 service)添加 Jwt 插件

curl -X POST http://localhost:8001/services/hello/plugins --data "name=jwt"

接着尝试访问这个受保护的服务

kirito$ curl http://localhost:8000/hello/hi
=> {"message":"Unauthorized"}

说明该 service 已经被 Jwt 保护起来了。

在 Kong 中创建用户

curl -X POST http://localhost:8001/consumers --data "username=kirito"

使用了新的端点 consumers 创建了一个名称为 kirito 的用户。

查看用户信息

curl http://127.0.0.1:8001/consumers/kirito/jwt

响应如下:

{
    "total": 1,
    "data": [
        {
            "created_at": 1523432449000,
            "id": "cb01a6cf-7371-4f23-8193-fa69a0bb070c",
            "algorithm": "HS256",
            "key": "vcnvYSFzTIGyMxzKSgnNU0uvxixdYWB9",
            "secret": "qQ9tSqIYjilnJmKuZXvJpgNo4ZqJDrim",
            "consumer_id": "7d34e6bc-89ea-4f33-9346-9c10600e4afd"
        }
    ]
}

重点关注三个值 algorithm,key,secret,他们和 Jwt 算法的参数密切相关

生成 Jwt

使用 jwt 官网(jwt.io)提供的 Debugger 功能可以很方便的生成 jwt。

jwt官网

HEADER 部分声明了验证方式为 JWT,加密算法为 HS256

PAYLOAD 部分原本有 5 个参数

{
    "iss": "kirito",
    "iat": 1441593502,
    "exp": 1441594722,
    "aud": "cnkirito.moe",
    "sub": "250577914@qq.com",
}

这里面的前五个字段都是由 JWT 的标准(RFC7519)所定义的。

  • iss: 该 JWT 的签发者
  • sub: 该 JWT 所面向的用户
  • aud: 接收该 JWT 的一方
  • exp(expires): 什么时候过期,这里是一个 Unix 时间戳
  • iat(issued at): 在什么时候签发的

iss 这一参数在 Kong 的 Jwt 插件中对应的是

curl http://127.0.0.1:8001/consumers/kirito/jwt 获取的用户信息中的 key 值。

而其他值都可以不填写

最后还要一个没有用到的用户信息:secret。HS256 加密算法是对称加密算法,加密和解密都依赖于同一个密钥,在生成 Jwt 的消息签名时(Verify Signature)需要被使用到。

我们使用 jwt 官网(jwt.io)提供的 Debugger 功能快速生成我们的 Jwt

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2Y252WVNGelRJR3lNeHpLU2duTlUwdXZ4aXhkWVdCOSJ9.3iL4sXgZyvRx2XtIe2X73yplfmSSu1WPGcvyhwq7TVE

由三个圆点分隔的长串便是用户身份的标识了

携带 Jwt 访问受限资源

kirito$ curl http://localhost:8000/hello/hi
=> {"message":"Unauthorized"}

在此之前直接访问 hello 服务是处于未验证状态

携带 Jwt 访问

curl http://localhost:8000/hello/hi -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2Y252WVNGelRJR3lNeHpLU2duTlUwdXZ4aXhkWVdCOSJ9.3iL4sXgZyvRx2XtIe2X73yplfmSSu1WPGcvyhwq7TVE'
=> 3000

成功获取到了服务端的响应,Jwt 插件就这样正常工作了。

补充

  1. Kong 支持修改默认生成的 key(对应 Jwt 中的 iss),和 secret
curl -X POST http://localhost:8001/consumers/kirito/jwt --data "secret=YmxvYiBkYXRh" --data "key=kirito"
  1. Jwt 也可以作为 QueryString 参数携带在 get 请求中
curl http://localhost:8000/hello/hi?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2Y252WVNGelRJR3lNeHpLU2duTlUwdXZ4aXhkWVdCOSJ9.3iL4sXgZyvRx2XtIe2X73yplfmSSu1WPGcvyhwq7TVE
  1. 通常用户需要自己写一个服务去帮助 Consumer 生成自己的 Jwt,自然不能总是依赖于 Jwt 官方的 Debugger,当然也没必要重复造轮子(尽管这并不难),可以考虑使用开源实现,比如 Java 中推荐使用 jjwt(https://github.com/jwtk/jjwt)
String jwt = Jwts.builder()
        .setHeaderParam("typ","jwt")
        .setHeaderParam("alg","HS256")
        .setIssuer("kirito")
        .signWith(SignatureAlgorithm.HS256, Base64.getEncoder().encodeToString("YmxvYiBkYXRh".getBytes(Charset.forName("utf-8"))))
        .compact();

原文发布于微信公众号 - Kirito的技术分享(cnkirito)

原文发表时间:2018-04-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏晓晨的专栏

ASP.NET Core 2.0 使用支付宝PC网站支付

34020
来自专栏c#开发者

BizTalk 2016 配置 RosettaNet遇到的坑

本文只针对已经安装好BizTalk 2016 需要在安装RosettaNet加速器的伙伴。 IIS配置 权限问题 错误信息 Failed to get I...

35170
来自专栏IT笔记

前后端分离之SpringBoot项目Token认证

写在开始 有人说,爱上一座城,是因为城中住着某个喜欢的人。其实不然,爱上一座城,也许是为城里的一道生动风景,为一段青梅往事,为一座熟悉老宅。或许,仅仅为的只是这...

48390
来自专栏数据库新发现

分配磁盘组(EMC阵列)

# ifconfig -a lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 in...

15920
来自专栏FreeBuf

无需四次握手包破解WPA&WPA2密码

知名密码破解软件Hashcat在2018年8月2日发布了4.2版本,这次版本更新的主要内容是增加了4个新的密码算法支持。

36030
来自专栏Golang语言社区

Go HttpServer 最佳实践

这是 Cloudflare 的 Filippo Valsorda 2006年发表在Gopher Academy的一篇文章, 虽然过去两年了,但是依然很有意义。

21100
来自专栏魏艾斯博客www.vpsss.net

解决 Winscp 不显示隐藏文件的办法

13920
来自专栏大魏分享(微信公众号:david-share)

讲真,Ansible 可以管理Windows?

前言: 本文是我和李尧老师一起实验。李尧是红帽高级培训讲师,目前负责红帽中国区员工内部技术培训与认证。 一、Ansible能对windows做什么操作? Ans...

83450
来自专栏小白安全

CVE-2018-4878 Flash 0day漏洞攻击样本解析

2018年1月31日,韩国CERT发布公告称发现Flash 0day漏洞的野外利用,攻击者执行针对性的攻击;2月1日Adobe发布安全公告,确认Adobe Fl...

41970
来自专栏一个爱瞎折腾的程序猿

metools,个人工具站点分享

我想要一个自己的工具站~一个不会说挂就挂的网站~ 然后~~ 卧槽。一不小心就折腾了出来,此处应有链接 http://tools.yimo.link/

17110

扫码关注云+社区

领取腾讯云代金券