一、前言
使用Kong中的JWT插件需要先在Kong的Consumers中创建一个Consumer,然后在该Consumer的Credentials中设置JWT的key和secret。
假定在3个项目组中共用一个单点登录模块的这么一个场景,使用Kong网关来对JWT Token进行拦截。
- A项目组负责单点登录
/api/user 提供登录,登出的接口
- B项目组负责APP1
/api/app1 应用1
/api/common/app1 不需要登录的查询页面
- C项目组负责APP2
/api/app2 应用2
/api/common/app2 不需要登录的查询页面
Kong网关不对/api/user,/api/common进行JWT Token拦截,只对/api/app1,/api/app2进行JWT Token拦截
用户登录时调用/api/user/login接口验证用户名和密码,验证通过后系统将userid和mobile写入到JWT Token中,并以该Token为KEY放入redis中。
用户端登录后把JWT Token放入HTTP Header中,请求/api/app1或者/api/app2的应用接口,如果JWT Token无效或过期,在Kong网关就被拦截了,不会调用到后端的/api/app1或是/api/app2的应用接口。
app1或是app2接收到请求后,先读取出HTTP Header中的Authorization值(即:Bearer + 1个空格+Token),然后读取本项目中的redis,如果没找到数据就调用A项目组的远程接口(各个项目组有自己的DB,不可以互相访问其他项目的DB,只能通过远程接口来进行访问),出于安全性考虑,B和C项目组没有密钥,无法对Token进行解析,只有A项目组才能从Token中解析出UserID和Mobile。
Kong网关中没有找到这样的功能:自动解析Token中的UserID和Mobile,添加到Header后再调用后端的应用ÿ