在这篇文章中,我将演示如何为SpringBoot 2.5OAuthJWT服务器配置一个双因素身份验证功能,这是一个更大的SpringCloud系统的一部分。
我们构建了一个分布式CRM系统。该系统具有专用的基于SpringBoot的身份验证/授权服务和许多安全和不安全的微服务。我们选择授权服务器的JWT安全机制来验证每个安全的微服务的任何请求,这是微服务的工作。另外,我们希望在授权服务发出有效的JWT之前为授权服务启用2FA身份验证,以达到另一级别的保护。
该员额安排如下。首先,我描述了系统的各个部分。其次,我演示了系统的体系结构,并描述了如何配置授权服务器来启用2FA。提供了整个系统的源代码。这里. 第二部分这篇文章演示了授权服务器如何在幕后工作。
系统
我们系统的组成图如图1所示。用户通过Zuul网关与系统进行交互。用户也可以直接调用单个的微服务RESTAPI。
Config服务器为微服务提供配置文件。全局配置文件包含所有微服务的信息。还有一些配置文件是针对单个微服务的.为了使其自动工作,所有服务都在Eureka服务器上注册。一些微型服务通过Kafka消息代理相互连接。Kafka的主机、端口和主题列在全局配置文件中。
本系统是以起动机为基础的。电码的伊斯克伦·伊万诺夫;见他的岗有关此系统如何工作的详细信息。我添加了一个双因素授权,并将授权服务器从1.5迁移到SpringBoot2.5。此外,我还分析了授权服务器如何在第二部分.
在这个分布式系统中,安全工作流比单块系统更复杂,用户只需要提供用户名和密码,可能还需要提供2FA代码。我们的系统使用隐式授权流。要获得有效的JWT,用户需要提供一个客户机ID(客户(为了简洁起见)和客户秘密(秘密为了简洁起见,这些都是微服务的“凭据”。此外,他或她需要提供一个有效的用户名和密码-这些是我们习惯的常规凭证。此外,如果用户启用了他/她的2FA,则该用户需要发送一个具有相同内容的额外请求。客户:秘密并提供必要的2FA代码。最后,要刷新JWT,用户必须提供客户:秘密以及有效的刷新令牌。
客户端ID、客户端秘密、用户名和密码存储在单独的数据库中,仅连接到授权服务器。此外,授权服务器保留一个私钥来签名JWT;所有安全服务都保留相应公钥的副本以验证签名。让我们看看如何配置这个授权服务器。
授权服务器体系结构
3种方案的实际工作流,由岗位上的阿纳尔·苏丹诺夫,如下所示。 如果用户有他/她2FA残疾人,用户可在1步内获得授权。用户进行以下调用:
curl trusted-app:secret@localhost:9999/oauth/token -d grant_type=password -d username=user -d password=password
这里trusted-app:secret 是客户:秘密在这个系统中,localhost:9999是东道主:港口在部署授权服务器的地方,/oauth/token是令牌端点。这个grant_type=password是2FA授权的第一步的授予类型,username和password是通常的用户凭据。系统返回一个有效的JWT和一个具有用户角色编码的刷新令牌。
如果用户有他/她2FA启用,用户打两个电话。第一个调用与上面的调用相同;但是,这一次,系统返回一个带有“preauth”角色编码的有效访问令牌。然后,用户再打一个电话:
curl trusted-app:secret@localhost:9999/oauth/token -d grant_type=tfa -d tfa_token=$token -d tfa_code=123456
在那里$token是上一步中的“preauth”访问令牌,tfa_code是2FA算法工作所必需的一次代码。系统返回一个有效的JWT和一个具有用户角色编码的刷新令牌。
注意,这个带有访问令牌(而不是JWT)的中间步骤防止了微服务错误地对用户进行身份验证,其中JWT是用JWT的公钥进行验证的,但是服务有一个“All以外的<角色>”过滤器。在这种情况下,“preauth”角色也是可以接受的。
最后,到刷新一个JTW(不一定过期),用户调用:
curl trusted-app:secret@localhost:9999/oauth/token -d grant_type=refresh_token -d refresh_token=$token
在我们使用的地方grant_type=refresh_token以及在前面步骤中获得的实际刷新令牌。
在引擎盖下,我们的系统如下(图2)。
图2.我们安全服务器的工作流程。
对于传入的令牌请求,系统首先验证客户:秘密对系统的基本身份验证过滤器,这反过来调用客户端和秘密身份验证管理器。如果为肯定,则请求将到达授权端点。/oauth/token.然后,系统根据请求类型调用用户名和密码验证器、2FA验证器或刷新令牌验证器;这些验证器在适当的令牌授予器中用于实际发出JWT。反过来,用户名和密码验证器需要用户名和密码身份验证管理器来完成其工作。让我们看看如何配置这些管理器。
认证管理器
这个客户端和秘密认证管理器由Spring授权服务器自动配置。在……里面第二部分在这篇文章中,我详细地展示了这是如何工作的。现在,我们只需要为客户:秘