身份验证流程电子邮件 URL 在 Web 服务器重置后不起作用

authentication-flows email URL's do not work after web server reset

我一直在尝试 authentication-flows 并注意到当我重新启动网络服务器时 URL 不再工作,它们都无效。我完成了调试,但我仍然不太清楚为什么会发生这种情况,尽管我有很多充分的理由说明它应该发生(而且我相信你也会这样做)。

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

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

提前谢谢你。


回应 Ohard 的评论:

1.为什么URL无效

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

09 Jan 2016 03:50:48,799 [http-nio-8082-exec-1] ERROR web.rest.UserActionRestController - Failed to decrypt URL content aX8uaOWkqAUQN2xOzlPAOHJjPZaxBwho7.yoMeUtMnJA

ohadr\crypto\service\CryptoService.java第261行出现异常:

throw new CryptoException("Failed to decrypt URL content " + based64EncryptedContent, e);

然后我使用一个断点来查找:

java aes javax.crypto.BadPaddingException: Given final block not properly padded

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

注意:当我在没有重新部署的情况下执行此操作时,一切都很好!

2。如何使授权流程作为 SaaS

我希望此服务满足三个用例:

  1. 目前,如果我托管一项服务并且它在没有故障转移的情况下停机,拥有 URL 的人将无法使用他们的 link 时它回来了。我希望他们无论如何都能使用 links。

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


编辑:

1.为什么URL无效

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

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

不用担心 csrf 没有启用。

1.为什么URL无效

看起来,ICryptoUtil 实例在您重新添加 war 之后是 re-created。

CryptoService.java 第 38 行:

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

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

@EdiZ 说的对。

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

我相信这可以解释您看到的行为。

Currently, If I host a service and it goes down without a fail-over, people who have URL's will be unable to use their links when it comes back up. I want them to be able to use the links regardless

这似乎是你第一个问题的重复;我认为必须解决第一个问题才能使其按您的意愿工作。如果服务器重新启动,所有 link 都会失效 - 用户将不得不再次单击 "forget password"(例如)并获得一个新的 link - 由您决定如何这笔交易很重要。

If I host this service and I do have a failover I assume the failover will not be able to read URL that is not from it originally. It should be able to read any of the enc's and process it.

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

希望对您有所帮助。