电影
equalsignorecase(别挠了,都快秃了,双因素认证我直接告诉你算了)

在此,我不会遍历地介绍每一个组成部分,而只会专注于AuthService、TokenManager和TotpManager。这些部分主要负责身份的认证流程。它们分别提供了以下功能:

TokenManager–该组件通过抽象代码,以生成和认证JWT令牌。它能够使得主要业务逻辑的实现与具体的JWT库相互独立。

下面,让我们逐步解读上述实现的过程。在逻辑判读中:如果当前用户是新用户,我们将对其进行注册;如果该用户已经存在于数据库之中,那么我们就必须拒绝该请求。具体步骤为:

  • 我们根据请求数据创建一个新的用户实体,并生成一个相应的密钥。
  • 如果该用户过去不存在,则将给出的新实体作为其默认实体。
  • 检查存储库的调用结果。
  • 将用户保存在数据库中,并获取其userId。
  • 颁发JWT。
  • 如果用户已经存在,则返回一个拒绝响应。

相比以漏洞和安全问题而闻名的SHA函数,我在此选用jBcrypt库,来产生各种安全的哈希和salt(盐)。

生成密钥

接下来,我们需要实现一个用来生成新的密钥的函数。它是由TotpManager.generateSecret()内部抽象而来。下面是它的代码:

Java:

1.  @Override 2.  public String generateSecret() { 3.    SecretGenerator generator = new DefaultSecretGenerator(); 4.    return generator.generate(); 5.  } 

不过,我们应当禁止同一封电子邮件两次进行注册。在此,我们通过断言,以保证应用在创建新用户之前,去检查现有的电子邮件列表:

可见,后台的逻辑步骤为:

  • 提供具有空字段的默认用户实体。
  • 检查该用户是否确实存在。
  • 从请求和salt处生成密码的哈希,并存储在数据库中。
  • 断言密钥是否能够确实匹配。
  • 认证一次性代码,并颁发JWT。

断言一次性代码

为了认证由应用生成的一次性代码,我们必须向TOTP库提供相应的代码和密钥,并将它们保存为用户实体的一部分。具体代码如下:

Java

1.  @Override 2.  public boolean validateCode(String code, String secret) { 3.    TimeProvider timeProvider = new SystemTimeProvider(); 4.    CodeGenerator codeGenerator = new DefaultCodeGenerator(); 5.    CodeVerifier verifier = new DefaultCodeVerifier(codeGenerator, timeProvider); 6.    return verifier.isValidCode(secret, code); 7.  } 

最后,我们可以通过测试,以认证登录的过程是否如期运行。我们将由Google Authenticator生成的代码作为登录请求的负载,去调用login端点。

如下图所示,为了检查出密码错误的情况,我们需要将进程终止在密码断言阶段:

至此,我们已经创建了一个简单的REST API,它可以通过Spring Webflux的TOTP来提供两因素身份认证。如前文所述,为了更专注于身份认证的逻辑,我们省略了所有的其他部分。


顶一下()     踩一下()

热门推荐

发表评论
0评