在微服务开发中中我们首先会通过认证中心获取JWT,然后每次发起后端请求都会将JWT放在请求头中,这时候我们后端需要对这个JWT进行验证判断是否合法及是否有对应请求权限,这一过程主要有两种方案:
首先咱们来看服务端验签的架构图。
服务端自主验签
首先梳理下执行流程:
http://usercenter/login #认证中心用户认证(登录)地址
{
"code": "0",
"message": "success",
"data": {
"user": {
"userId": 1,
"username": "zhangsan",
},
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoxLFwidXNlcm5hbWVcIjpcInpoYW5nc2FuXCIsXCJuYW1lXCI6XCLlvKDkuIlcIixcImdyYWRlXCI6XCJub3JtYWxcIn0ifQ.1HtfszarTxLrqPktDkzArTEc4ah5VO7QaOOJqmSeXEM"
}
}
{
"code": "0",
"message": "success",
"data": {
"user": { #用户详细数据
"userId": 1,
"username": "zhangsan",
"name": "张三",
"grade": "normal"
"age": 18,
"idno" : 130.......,
...
},
"authorization":{ #权限数据
"role" : "admin",
"permissions" : [{"addUser","delUser","..."}]
}
}
}
到此从登录创建 JWT 到验签后执行业务代码的完整流程已经完成。
下面咱们来聊一聊第二种方案:
api网关统一验签方案
API 网关统一验签与服务端验签最大的区别是在 API 网关层面就发起 JWT 的验签请求,之后路由过程中附加的是从认证中心返回的用户与权限数据,其他的操作步骤与方案一是完全相同的。
在这你可能又会有疑惑,为什么要设计两种不同的方案呢?其实这对应了不同的应用场景:
那在项目中到底如何选择呢?
服务端验签控制力度更细,适合应用在低延迟、高并发的应用,例如导航、实时交易系统、军事应用。 而 API 统一网关则更适合用在传统的企业应用,可以让程序员专心开发业务逻辑,同时程序也更容易维护。
虽然 JWT 看似很美,在实施落地过程中也会遇到一些特有的问题,例如:
架构是一门取舍的艺术,没有完美的架构,只有适合的场景!
End
干货分享
这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取!