【问题标题】:Safely storing refresh tokens in Java application在 Java 应用程序中安全地存储刷新令牌
【发布时间】:2022-01-11 23:00:30
【问题描述】:

假设我们有一个非常简单的 Java 应用程序,它编辑远程服务器上的资源,并使用访问令牌进行身份验证。应用程序总是使用相同的身份,所以它总是使用相同的客户端 id、秘密和刷新令牌来获取访问令牌。

整个身份验证过程应该在没有用户干预的情况下完成,应用程序应该执行用户从另一个应用程序自动触发的操作。另一个应用正在发送 HTTP 请求,但整个内容只能在内部网络中访问,并且没有“合法”的方式可以在外部访问它。

有没有办法在我的应用程序中安全地保存这些数据(刷新令牌、客户端 ID、机密...)?

我看到过类似的问题,但他们都谈到了网站和 cookie,但这应该发生在幕后,没有任何前端等,所以我认为这些不适用于我的问题。

编辑:应用程序将部署在内部服务器上,因此它不是桌面解决方案。基本上有一个内部应用程序会向我发送 HTTP 请求,从而在内部网络之外的远程服务器上触发编辑。

【问题讨论】:

    标签: java security oauth-2.0


    【解决方案1】:

    将客户端机密、访问令牌、刷新令牌等存储在持久性存储中并不是一个好主意,除非它存储在机密存储(如 Vault)中。但还有其他选择。

    如果您使用的是 Spring,那么您可以使用 Spring OAuth2RestTemplate,否则您可以通过查看代码来编写类似的内容。

    它透明地获取或更新访问令牌并缓存以避免往返授权服务器。

    【讨论】:

    • 我确实使用了 Spring(所以我会检查一下)并且实际上仅在创建我的 Bean 时才使用令牌。该解决方案需要我生存,所以这就是我考虑存储它的原因。我的整个问题可能会被误导和/或愚蠢(除了“改变你的方法”之外可能没有其他答案),但我受到另一台服务器的限制,当我寻找特定的解决方案来对其进行身份验证时,我总是发现后记安全地存储令牌 - 这就是我的问题。还是谢谢!
    【解决方案2】:

    最简单的选择是使用内存存储,但如果由于您需要处理重启等问题而无法使用,操作系统会为每个用户提供安全存储。这是 OAuth 桌面或控制台客户端有时使用的模型:

    • Windows 上的凭据管理器
    • macOS 上的钥匙串
    • Linux 上的密码和密钥

    通过使用诸如java-keytar 之类的库,需要一些本机互操作来与这些凭据存储进行交互。

    桌面示例

    要比较的东西,请参阅我的这些资源:

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2020-12-21
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2017-08-15
      相关资源
      最近更新 更多