首页 » PHP教程 » php验证系技巧_API网关的权限验证实践

php验证系技巧_API网关的权限验证实践

访客 2024-10-23 0

扫一扫用手机浏览

文章目录 [+]

常用 API 接口安全方法如下几种:

(1)数据加密

php验证系技巧_API网关的权限验证实践

数据在互联网传输过程很随意马虎被抓包,如果直接传输,那么用户数据可能被其他人获取,导致系统安全性等问题,以是必须对数据加密。
常见的做法是对关键字段加密,比如用户密码直接通过 md5 加密。

php验证系技巧_API网关的权限验证实践
(图片来自网络侵删)

(2)数据署名

数据在传输过程中经由加密,理论上就算被抓包,也无法对数据进行修改,但是我们一样平常加密的部分实在只是在外网,现在很多做事在内网中都须要经由很多做事跳转,如果被攻入内网,则可以在任意节点修改数据,以是这里的加数据署名可以防止内网中数据被修改。
数据署名便是由发送者产生一段无法假造的一段数字串,来担保数据在传输过程中不被修改。
md5算法是常用的数据署名算法,其事理是将须要提交的数据通过某种办法组合成一个字符串,然后通过md5算法天生一段加密字符串,这段加密字符串便是数据包的署名。
为担保安全性,末了的密钥会在客户端和做事端各备一份。

(3)添加韶光戳

经由如上的加密,加签处理,就算拿到数据也不能看到真实的数据;但是有些攻击者不关心真实的数据,而是直接拿到抓取的数据包做恶意要求,以达到攻击的目的。
我们可以利用韶光戳机制,在每次要求的时候加入当前的韶光,做事器端会拿到当前韶光和中的韶光相减,看看是否在一个固定的韶光范围内,超过韶光差的要求就视为造孽要求。

(4)限流机制

如果有用户涌现频繁调用接口的情形;这种情形须要给干系用户做限流处理,常用的限流算法包括:令牌桶限流,漏桶限流,计数器限流。
令牌桶限流:系统以一定速率向桶中放入令牌,填满了就丢弃令牌;要求来时会先从桶中取出令牌,如果能取到令牌,则可以连续完成要求,否则等待或者谢绝做事。
令牌桶许可一定程度突发流量,只要有令牌就可以处理,支持一次拿多个令牌。
漏桶限流:按照固定常量速率流出要求,流入要求速率任意,当要求数超过桶的容量时,新的要求等待或者谢绝做事,因此漏桶算法可以逼迫限定数据的传输速率。
计数器限流:这是一种比较大略粗暴的算法,紧张用来限定总并发数,比如数据库连接池、线程池、秒杀的并发数;计数器限流只要一定韶光内的总要求数超过设定的阀值则进行限流。

(5)黑名单限流

如果此用户进行过很多造孽操作,或者说专门有一个中黑系统,经由剖析之后直接将此用户列入黑名单,所有要求直接返回缺点码。
我们可以给每个用户设置一个状态比如包括:初始化状态,正常状态,中黑状态,关闭状态等等;或者我们直接通过分布式配置中央,直接保存黑名单列表,每次检讨是否在列表中即可。

常用的安全戒备有以下办法:API Keys、Basic Auth、HMAC、OAuth。
本文紧张谈论基于OAuth协议的API安全验证。
本文紧张先容基于OAuth协议(Client Credentials)的实践。

系统架构

下图是一个笔者亲自经历的一个例子,到目前为止,运转良好。
API做事做事网关采取基于Kong API网关的实现,认证中央是实现OAuth 2.0协议的权限认证系统,做事供应系统设置基于IP的白名单访问。

OAuth 2.0是一种用户验证和授权用户的盛行方法,此方法依赖于身份验证做事器和API做事器进行通信以付与访问权限,在笔者的前面的文章中已经详细阐述OAuth的事理,在这里就不在赘述,想看的读者可以翻看历史记录找到该篇文章。
下图标注了详细的流程。

JWT令牌的理论

JWT(全称:Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的办法,用于作为JSON工具在各方之间安全地传输信息。
该信息可以被验证和信赖,由于它是数字署名的。
如有读者想理解详细的JWT规范,可以访问RFC7519的官方网站:https://datatracker.ietf.org/doc/html/rfc7519。

JWT由3部分组成:标头(Header)、有效载荷(Payload)和署名(Signature)。
在传输的时候,会将JWT的3部分分别进行Base64编码后用。
进行连接形成终极传输的字符串。
JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)。

下图为一个大略的JWT的解码出来的例子:

以上图为例,JWT的数据构造一样平常是一个三段式的字符,以“.”隔开:xxxxx.yyyyy.zzzzz。

JWT第一部分是Header头部分,它是一个描述JWT元数据的Json工具,常日如下所示。
alg属性表示署名利用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT。
末了,利用Base64 URL算法将上述JSON工具转换为字符串保存。

JWT第二部分是Payload,也是一个Json工具,除了包含须要通报的数据,还有七个默认的字段供选择。
分别是,iss:发行人、exp:到期韶光、sub:主题、aud:用户、nbf:在此之前不可用、iat:发布韶光、jti:JWT ID用于标识该JWT。
也可以加上自定义字段。
须要把稳的是,默认情形下JWT是未加密的,任何人都可以解读其内容,因此如果一些敏感信息不要存放在此,以防信息透露。
JSON工具也利用Base64 URL算法转换为字符串保存。

JWT第三部分是Signature署名。
是这样天生的,首先须要指定一个secret,该secret仅仅保存在做事器中,担保不能让其他用户知道。
然后利用Header指定的算法对Header和Payload进行打算,然后就得出一个署名哈希。
也便是Signature。

那么Application Server如何进行验证呢?可以利用JWT前两段,用同一套哈希算法和同一个secret打算一个署名值,然后把打算出来的署名值和收到的JWT第三段比较,如果相同则认证通过。

JWT的优点包括如下:JSON格式的通用性,以是JWT可以跨措辞支持,比如Java、JavaScript、PHP、Node等等。
可以利用Payload存储一些非敏感的信息。
便于传输,JWT构造大略,字节占用小。
不须要在做事端保存会话信息,易于运用的扩展。

Kong API网关的JWT令牌运用

下图是Kong认证的实际过程。

如果配置中许可OPTIONS要求,并且要求的方法确实是OPTIONS,放行。

如果配置中设置了匿名消费者,并且有凭据,放行。
这里是为了实现多重认证,通过配置匿名消费者来实现逻辑或的认证,此时必须有其他认证插件,当其他认证插件通过,jwt插件就不再验证,若不设置匿名,则既要jwt验证也要其他认证插件验证。

先后从query params,request header中查找token(根据配置的变量),token的格式为\\s[Bb]earer\\s+(.+),如果从query params找到就返回了,不会再根据request header找。

如果没有找到token,或者token格式不对,并且不许可匿名,返回401。

如果没有找到token,并且许可匿名,根据配置的匿名的id查询消费者,增加request header:X-Consumer-ID、X-Consumer-Username和X-Anonymous-Consumer=true,id是自动天生的,username是配置时填写的,设置这个消费者的凭据是nil,放行。

如果找到token,且格式合法,jwt解码这个token,验证token的 claim,消费者,署名验证,过期验证,全部通过后,同匿名一样,增加步骤5中的request header,并且打消X-Anonymous-Consumer这个header。

以下是Kong网关集成OAuth插件的例子,首先启用OAuth插件,然后在将插件添加到须要集成权限的Service上。

要求的时候只要在HTTP Header带上“Content-Type:application/json”和“Authorization: Bearer 认证中央申请的JWT令牌”即可访问到所需的资源。

Spring Cloud Gateway的JTW令牌运用

Spring Cloud Gateway是Spring官方基于Spring 5.0、Spring Boot 2.0和Project Reactor等技能开拓的网关,Spring Cloud Gateway旨在为微做事架构供应一种大略而有效的统一的API路由管理办法。
Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅供应统一的路由办法,并且基于Filter链的办法供应了网关基本的功能,例如:安全,监控/埋点,和限流等。

利用Gateway全局过滤器获取JWT Token后进行用户认证及鉴权。
下图为实现该过滤器的代码。

JWT令牌运用实例

1、登录获取token

2、将token设置到Request Header后,访问资源做事

3、当没有token访问资源做事时就会返回401

总结

末了讲讲JWT的缺陷,任何技能都不是完美的,以是我们得用辩证思维去看待任何一项技能。
安全性没法担保,以是jwt里不能存储敏感数据。
由于jwt的payload并没有加密,只是用Base64编码而已。
无法中途废弃。
由于一旦签发了一个jwt,在到期之前始终都是有效的,如果用户信息发生更新了,只能等旧的jwt过期后重新签发新的jwt。

续签问题。
当签发的jwt保存在客户端,客户端一贯在操作页面,按道理该当一贯为客户端续长有效韶光,否则当jwt有效期到了就会导致用户须要重新登录。
那么怎么为jwt续签呢?最大略粗暴便是每次签发新的jwt,但是由于过于暴力,会影响性能。
如果要优雅一点,又要引入Redis办理,但是这又把无状态的jwt硬生生变成了有状态的,违背了初衷。
以是印证了那句话,没有最好的技能,只有适宜的技能。
感谢大家的阅读,希望看完之后能对你有所收成。

本文大略的谈论API权限认证,关于API的限流等,后续将持续分享其他内容。
码字不易,欢迎关注、点赞、收藏。

标签:

相关文章

Java代码虚拟化保护技术与应用前景

软件应用的需求日益增长,软件开发过程中对代码的保护成为了一个重要议题。Java作为一种广泛应用于企业级应用的编程语言,其代码虚拟化...

PHP教程 2025-03-02 阅读1 评论0

CAD插件错误代码与应对步骤

CAD(计算机辅助设计)软件在工程设计领域得到了广泛应用。CAD插件作为提升设计效率的重要工具,在提高设计师工作效率的也带来了一定...

PHP教程 2025-03-02 阅读1 评论0

上古卷轴代码规则大全游戏背后的编程奥秘

《上古卷轴》作为一款深受玩家喜爱的角色扮演游戏,自问世以来便以其丰富的世界观、独特的游戏体验和深厚的文化底蕴吸引了无数玩家。在这款...

PHP教程 2025-03-02 阅读1 评论0