[Pulsar] JWT 认证的原理
在https://xie.infoq.cn/article/8a1479d397211606e5223f3e5中我们介绍了如何设置 JWT 认证,本文将介绍 Pulsar 的 JWT 认证的原理。
Pulsar 的认证 Provider 都需要实现 AuthenticationProvider 的接口,JWT 认证使用的是 AuthenticationProviderToken 进行实现。初始化的时候,会创建一个 Jwt Parser,用于后续的 token 解析。
而其中所使用的 validationKey,则是使用用户所设置的密钥以及加密算法生成的。
当需要进行认证的时候,Broker 会调用 AuthenticationProviderToken 的 authenticate 方法,这个方法会返回 token 所解析并认证的 role,如果认证失败则会抛出 AuthenticationException,如下。
在 Broker 调用认证方法时,会传入认证所需要的参数 AuthenticationDataSource,通过这个 authData,可以得到 token 的信息。authData 中有两种存储 token 的方式,如果是使用 binary protocol 协议的形式,如使用 Java client 或 pulsar client tool 进行访问认证,则会将 token 存储到 authData 中的 command data 中;而如果使用 http/https 协议,如使用 pulsar admin 进行访问认证,则会将 token 存储到 authData 中的 http data 的 header "Authorization"中,与 Web 的 JWT 认证一样,其 token 前会带有 Bearer 的前缀。
第二步就是对 token 进行认证,调用 authenticateToken 的方法,内部主要是调用 parser 进行解析认证。
当认证失败,如 token 过期等问题,则会抛出 JwtException 的异常,成功则返回解析出来的 Jwt 结构。
最后一步就是根据上一步所得到的 Jwt 结构,得到其中的 principal,也就是用户所使用的角色。调用的是 getPrincipal 方法。
这里支持两种类型的 role,一种是字符串类型的,一种是数组类型的。用户可以通过 tokenAuthClaim 设置所使用的 role 的字段。对于数组类型的 roles,则会返回第一个作为 role,用于后续的鉴权。
至此,整个 JWT 认证就完成了,后续 Broker 将会利用所得到的角色,用于鉴权,最终再进行各类的资源访问和操作。
版权声明: 本文为 InfoQ 作者【Zike Yang】的原创文章。
原文链接:【http://xie.infoq.cn/article/519fef2c6e5ba9323d1b97fba】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论