应用服务网格 ASM-JWT认证原理:JWT认证原理

时间:2024-06-21 16:58:17

JWT认证原理

JWT(Json Web Token)是一种服务端向客户端发放令牌的认证方式。客户端用户名密码登录时,服务端会生成一个令牌返回给客户端;客户端随后在向服务端请求时只需携带这个令牌,服务端通过校验令牌来验证是否是来自合法的客户端,进而决定是否向客户端返回应答。从机制可以看到,这种基于请求中携带令牌来维护认证的客户端连接的方式解决了早期服务端存储会话的各种有状态问题。

在Istio使用中,JWT令牌生成由特定的认证服务提供,令牌验证由网格执行,彻底解耦用户业务中的认证逻辑,使应用程序专注于自身业务。基于Istio的JWT完整机制如图1所示。

图1 Istio JWT认证流程

① 客户端连接认证服务,提供用户名和密码;

② 认证服务验证用户名和密码,生成JWT令牌,包括用户标识和过期时间等信息,并使用认证服务的私钥签名;

③ 认证服务向客户端返回生成的JWT令牌;

④ 客户端将收到的JWT令牌存储在本端,供后续请求时使用;

⑤ 客户端在向其他服务发起请求时携带JWT令牌,无需再提供用户名、密码等信息;

⑥ 网格数据面代理拦截到流量,使用配置的公钥验证JWT令牌;

⑦ 验证通过后,网格代理将请求转发给服务端;

⑧ 服务端处理请求;

⑨ 服务端返回应答数据给网格代理;

⑩ 网格数据面代理转发应答数据给调用方。

在这个过程中,重点是第六步,原来服务端的JWT认证功能迁移到了网格代理上。网格数据面从控制面配置的认证策略中获取验证JWT令牌的公钥,可以是jwks(JSON Web Key Set)上配置的公钥,也可以是从jwksUri配置的公钥地址获取到的公钥。获得公钥后,网格代理使用该公钥对认证服务私钥签名的令牌进行验证,并解开令牌中的iss,验证是否匹配认证策略中的签发者信息。验证通过的请求发送给应用程序,验证不通过则直接拒绝,不会发送给应用程序。

support.huaweicloud.com/usermanual-asm/asm_01_0096.html