1

我一直在玩身份验证流程,并注意到当我重新启动 Web 服务器时,URL 不再起作用,它们都是无效的。我进行了调试,但我仍然有点迷失到底是为什么,尽管我有很多很好的理由说明它应该发生(我相信你也会这样做)。

我想创建一个服务,该服务将分发到多个容器中,当有请求进入时,它们中的任何一个都可以提供服务。就目前的解决方案而言,看来我必须进行修改才能使其成为可能。

究竟是什么使 URL 无效?为了使我提出的解决方案成为可能,我可以做出哪些改变?

先感谢您。


回应奥哈德的评论:

一、为什么网址无效

让我告诉你我是如何得到错误的。我部署战争,提交忘记密码。接收电子邮件以重置我的密码,然后停止战争。发生这种情况时,我的重置密码页面会提取 enc。然后我停止并重新部署战争。在向 /rest/setNewPassword 映射发送带有 enc 和新密码的休息请求后,然后接收:

2016 年 1 月 9 日 03:50:48,799 [http-nio-8082-exec-1] 错误 web.rest.UserActionRestController - 无法解密 URL 内容 aX8uaOWkqAUQN2xOzlPAOHJjPZaxBwho7.yoMeUtMnJA

ohadr\crypto\service\CryptoService.java第 261 行有一个异常:

throw new CryptoException("解密 URL 内容失败" + based64EncryptedContent, e);

然后我使用断点来查找:

java aes javax.crypto.BadPaddingException:给定最终块未正确填充

我敢肯定,如果您尝试重现此问题,您会发现相同的结果...

注意:当我在没有重新部署的情况下这样做时,一切都很好!

2. 如何让 auth-flows 作为 SaaS 工作

我希望这项服务能够实现三个用例:

  1. 目前,如果我托管一个服务并且它在没有故障转移的情况下出现故障,那么拥有 URL 的人在它恢复时将无法使用他们的链接。我希望他们无论如何都能够使用这些链接。

  2. (未经测试——但很快)与第二个类似,如果我在多个 docker 容器上托管此服务,我相信它将无法接收最初不是来自其容器的链接,因此容器无法共享未排序的负载. 它应该能够读取任何 enc 并对其进行处理。


编辑:

一、为什么网址无效

一个更简单的测试方法是提交一个忘记的密码,获取电子邮件,然后停止战争。重新部署它,然后单击链接。我得到了这个堆栈跟踪:

https://drive.google.com/file/d/0Bwa-JXbjFUDueXVMWWJibjY2Zm8/view?usp=sharing

不用担心 csrf 它没有启用。

4

2 回答 2

1

一、为什么网址无效

看起来,ICryptoUtil 实例是在您重新复制战争后重新创建的。

CryptoService.java 第 38 行:

return  ContextLoader.getCurrentWebApplicationContext().getBean(ICryptoUtil.class);

我建议你做一个小测试。加密字符串两次,现在和重新部署后比较结果。如果您得到 2 个不同的结果,那么您的加密将无法解密另一个加密实例的加密字符串。

于 2016-01-09T18:29:38.700 回答
0

@EdiZ 是对的。

更准确地说,每次你的 web 应用加载时,Spring 都会加载所有的 bean。其中包括 Crypto 的库 bean,例如CryptoUtilCryptoProvider,如果您仔细观察,您会注意到 DefaultCryptoProvider.loadMasterKeys() 生成了一个新密钥。

我相信这解释了你看到的行为。

目前,如果我托管一个服务并且它在没有故障转移的情况下出现故障,那么拥有 URL 的人在它恢复时将无法使用他们的链接。我希望他们能够使用这些链接,不管

这似乎是您第一个问题的重复;我认为必须解决第一个问题才能使其按您的意愿工作。如果服务器重新启动,所有链接都将失效——用户将不得不再次点击“忘记密码”(例如)并获得一个新链接——由您决定这笔交易有多大。

如果我托管此服务并且我确实有故障转移,我假设故障转移将无法读取最初不是来自它的 URL。它应该能够读取任何 enc 并对其进行处理。

我假设您必须开发更多的持久性,以便服务器可以解密不是由它生成的 URL...

希望有帮助。

于 2016-01-09T19:00:04.883 回答