https://keyholesoftware.com/2016/06/20/json-web-tokens-with-spring-cloud-microservices/ 作者:THOMAS KENDALL 译者:oopsguy.com
微服务安全是架构的一个重要部分。具体来说,就是认证和授权模式。
微服务认证和授权处理方式有几种选择,但本文只介绍 JSON Web Token 的使用。
JSON Web Token(JWT)本质上是一个独立的身份验证令牌,可以包含用户标识、用户角色和权限等信息,以及您可以存储任何其他信息。任何人都可以轻松读取和解析,并使用密钥来验证真实性。有关 JSON Web Token 的简要介绍,请查看此页面(https://jwt.io/introduction/)。
微服务使用 JSON Web Token 的一个优点是,我们可以配置它以便包含用户拥有的任何权限。这意味着每个服务不需要与授权服务交互才能授权用户。
JWT 的另一个优点是它们是可序列化的,足够短的长度使得它可以放置在请求头中。
JWT 的工作流程相当简单。第一次请求是一个带有用户名和密码的无身份验证端点的 POST。
认证成功后,响应将包含 JWT。之后所有的请求都附带一个 HTTP 头,其包含了 JWT 令牌: Authorization:xxxxx.yyyyy.zzzzz
。
任何服务间的请求都要通过该头,以便其他服务可以应用授权。
我们需要做的第一件事是弄清楚如何生成 JWT。幸运的是,我们不是第一个踩坑的人,有几个现成的类库可供我们选择。
我选择了 Java JWT(https://github.com/jwtk/jjwt)。这是我的实现:
现在我们有了这个工具类,之后需要在每个微服务中配置 Spring Security。
为此,我们需要自定义一个验证过滤器,如果存在请求头,则读取它。Spring 有一个认证过滤器 RequestHeaderAuthenticationFilter
,我们可以继承它。
此时,头已经以 PreAuthenticatedAuthenticationToken
的形式转换为 Spring Authentication 对象。
我们现在需要一个 AuthenticationProvider 用于读取令牌,从而进行身份验证,并将其转换为我们自己自定义的 Authentication 对象。
有了这些组件,我们可以在 Spring Security 中使用 JWT 了。 在进行服务间通信时,我们需要传递 JWT。
我使用了一个 Feign 客户端,把 JWT 作为参数。
为了传递 JWT,我在控制器的 Spring Security 中抓取它:
JWT 可以很好地适应分布式微服务环境,并提供了大量功能。 如果您正想为下一个微服务项目设计一个安全架构,请考虑使用 JSON Web Token。
(本文为公众号 oopsguy_com 所有,欢迎转载)