Flask接口签名sign原理与实例代码浅析
1720
2023-07-19
本文讲了微服务网关鉴权的解决方案,微服务实现网关统一鉴权方法。
解决方案:微服务网关实现简单鉴权
关键词
JWT(xxxxx.yyyyy.zzzzz)
JJWT工具
网关过滤器解析TOKEN
在网关系统中比较适合进行权限校验
一、微服务架构下统一认证思路
基于Session的认证方式
在分布式的环境下,基于session的认证会出现一个问题,每个应用服务都需要在session中存储用户身份信息,通过负载均衡将本地的请求分配到另一个应用服务需要将session信息带过去,否则会重新认证。我们可以使用Session共享、Session黏贴等方案。
Session方案也有缺点,比如基于cookie,移动端不能有效使用等
基于Token的认证方式
优点:服务端不用存储认证数据;易维护扩展性强;客户端可以把token 存在任意地方;可以实现web和app统一认证机制
缺点:token由于自包含信息,因此一般数据量较大,而且每次请求都需要传递,因此比较占带宽。另外,token的签名验签操作也会给cpu带来额外的处理负担
二、基于Token的认证方式(JWT)
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
2.1 头部(Header):
作用:在头部指明了签名算法
例如:{“typ”:“JWT”,“alg”:“HS256”}
将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分
2.2 载荷(playload):
作用:载荷就是存放有效信息的地方
例如:{“sub”:“1234567890”,“name”:“John Doe”,“admin”:true}
将其进行base64加密,得到Jwt的第二部分
2.3 签名(signature):
作用:jwt的第三部分是一个签证信息,这个签证信息由三部分组成
header (base64后的)
payload (base64后的)
secret
例如:HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload)+ secret )
内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己 编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。
鉴权逻辑
开发中的鉴权逻辑:
当客户端第一次请求服务时,服务端对用户进行信息认证(登录)
认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证
以后每次请求,客户端都携带认证的token
服务端对token进行解密,判断是否有效。
如上图,对于验证用户是否已经登录鉴权的过程可以在网关层统一检验。检验的标准就是请求中是否携 带token凭证以及token的正确性。
代码实现
下面的我们自定义一个GlobalFilter,去校验所有请求的请求参数中是否包含“token”,如何不包含请求 参数“token”则不转发路由,否则执行正常的逻辑。
@Componentpublic class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChainchain) {
//String url = exchange.getRequest().getURI().getPath(); //忽略以下url请求 //if(url.indexOf("/login") >= 0){ // return chain.filter(exchange); // } String token = exchange.getRequest().getQueryParams().getFirst("token");
if (StringUtils.isBlank(token)) {
log.info( "token is empty ..." );
exchange.getResponse().setStatusCode( HttpStatus.UNAUTHORIZED );
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);}@Overridepublic int getOrder() {
return 0;
}}
自定义全局过滤器需要实现GlobalFilter和Ordered接口。
在filter方法中完成过滤器的逻辑判断处理
在getOrder方法指定此过滤器的优先级,返回值越大级别越低
ServerWebExchange 就相当于当前请求和响应的上下文,存放着重要的请求-响应属性、请求实 例和响应实例等等。一个请求中的request,response都可以通过 ServerWebExchange 获取
调用 chain.filter 继续向下游执行
一、背景介绍:
之前做微服务项目的时候鉴权操作都放在了各个服务中,每个服务都集成了spring security或者shiro框架或者写拦截器自己做鉴权操作,最近刚好有时间实现网关统一鉴权。之前:
统一鉴权之后服务呢就是单纯提供资源的服务了,叫资源服务。
鉴权操作一般都是有个单独的授权服务,实现方式:
1、网关调用授权服务的鉴权接口
2、网关和授权服务连接同一个redis
3、token使用jwt
个人感觉第一种方式不太可取,访问资源的每个接口网关都需要调用下授权服务有点鸡肋,增加了授权服务的压力,我选择2和3两种方式进行了实现,只不过使用jwt方式想要主动使此token过期功能则需要另外实现,jwt生成时就已经规定了什么时间过期。
二、授权认证时序图
这是第二种实现方式,网关和授权服务连接同一个redis,第三种就是除了没有redis其他流程一样,所以这也是统一鉴权其中一种好处,换框架换校验方式等只需要修改网关就行了。
流程:
① 用户申请令牌(可理解为登录)
② 授权服务颁发令牌(登陆成功返回token)
③ 用户拿到令牌去访问接口 (前端把token放到请求头)
④ 网关鉴权(接口级别的权限,有访问权限则把用户信息通过redis或者jwt解析出来,再通过base64加密或者其他加密算法把用户信息加密,如果资源服务不对外暴露全是内网用base64就行了,速度快,我使用的是AES对称加密)
⑤ 资源服务解析用户信息并生成上下文(解析并提供一个静态工具类能获得当前用户的信息方便业务使用)
上文就是小编为大家整理的微服务网关鉴权的解决方案,微服务实现网关统一鉴权方法。
国内(北京、上海、广州、深圳、成都、重庆、杭州、西安、武汉、苏州、郑州、南京、天津、长沙、东莞、宁波、佛山、合肥、青岛)API接口文档平台软件分析、比较及推荐。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~