Web 和桌面客户端应用程序的单点登录

问题描述 投票:0回答:0

我的团队正在对遗留应用程序进行现代化改造。其中一部分是用新的网络客户端替换旧的桌面客户端。在可预见的未来,当我们将越来越多的功能从旧版本迁移到新版本时,这两个客户端将并行存在。这项工作的另一部分是用带有 Keycloak 的 OAuth 解决方案替换我们的手动身份验证和授权机制。

我们现在要做的是:

我们的最新功能将仅存在于网络客户端中。要从桌面客户端使用它,单击相应的按钮将简单地打开具有特定 URL 的系统浏览器。

这已经有些不便了,我们希望尽量减少给用户带来的任何进一步不便。桌面客户端启动时用户已经登录。我们不希望用户在 Web 客户端中再次登录,特别是因为他们可能会在一天内多次打开和关闭此浏览器窗口,而不是一直打开它(尽管我们希望行为会随着时间的推移而改变)越来越多的旧功能迁移过来的时间)。理想情况下,如果用户选择之后手动打开浏览器,他们也会保持登录状态。

我们怎样才能做到这一点?我们目前的想法是:

  1. 当用户使用桌面客户端登录时,服务器使用凭据执行both旧登录以及从Keycloak获取访问和刷新令牌。
  2. 服务器定期刷新令牌。
  3. 从桌面客户端访问的所有旧功能将使用旧机制,所有新功能将使用访问令牌。
  4. 当用户单击新按钮时,服务器上会生成一个随机数,并传送到桌面客户端,桌面客户端将其附加到浏览器窗口的 URL 中。浏览器将随机数交换为访问和刷新令牌。

此工作流仅部分解决了问题。缺点:

  • 这仅在服务器和 Web 客户端都可以彼此独立地刷新其访问令牌时才有效。如果刷新令牌是一次性使用的(我们希望提高安全性),这是不可能的。 Web 客户端需要刷新,因为点击新功能可能需要一些时间,比单个访问令牌有效的时间还要长。服务器需要刷新其令牌集,以便在用户再次单击按钮时做好准备。
  • 在这种情况下,服务器将使用 password_grant,它不会在 Keycloak 服务器上建立会话。因此不能在浏览器中设置会话cookie,如果用户手动打开浏览器将被强制重新登录。

我敢肯定我们不是第一个遇到这种问题的人。其他公司是如何解决的?我知道一种方法是切换顺序并使用浏览器进行桌面客户端的登录。但这在我们的例子中不起作用,因为服务器仍然需要用户的凭据才能使用旧的授权功能。虽然我们现在可以将身份验证切换到 OAuth,但授权很复杂,需要一些时间才能准备好切换。

如果有帮助:服务器和桌面客户端都是用 Java 编写的。 Web 客户端使用 Angular.

authentication oauth-2.0 authorization keycloak
© www.soinside.com 2019 - 2024. All rights reserved.