首页 > 解决方案 > 在 SpringBoot 应用程序中缓存 OAuth2 令牌?

问题描述

我正在实现一个 Spring Boot 应用程序,其中的方法正在调用第三方 REST 端点。此 REST API 可在 OAuth2 身份验证后访问。这就是我从第三方检索令牌(各种用户可以使用我的应用程序并恭敬地调用 REST 端点)并使用这些令牌进行授权以调用端点的原因。但是在当前的实现中,这发生在每次调用之前。这就是为什么我想请教如何缓存这些令牌以及这是否是一个好习惯?令牌也会在 1 小时内到期。

标签: spring-bootcachingoauth-2.0token

解决方案


如果您可以将访问令牌存储在客户端并随每个请求一起发送,则不应在 Web 应用程序的后端缓存访问令牌。

如果您无法将其存储在客户端(可能的情况下,您的 API 正在与 USSD、SMS 等消息客户端通信),获取 OAuth 访问令牌会很昂贵,因为它需要 HTTP 请求令牌端点。这种情况是一个很好的例子,您可以尽可能缓存令牌。如果您有多个实例,则可以使用 REDIS。

记住:令牌是敏感数据,因为它们授予对用户资源的访问权限。(此外,与用户密码不同,您不能只存储令牌的哈希值。)因此,保护​​令牌不被泄露至关重要。您可以使用加密。请查看以下链接以获取更多详细信息:

https://auth0.com/docs/best-practices/token-best-practices

https://github.com/auth0/express-openid-connect/blob/master/EXAMPLES.md#5-obtaining-and-storing-access-tokens-to-call-external-apis

https://docs.microsoft.com/en-us/azure/architecture/multitenant-identity/token-cache

根据 Auth0 令牌最佳实践

存储和重复使用。 通过存储从授权服务器获得的访问令牌,减少扩展应用程序攻击面的不必要往返,并优化计划令牌限制(如果适用)。与其请求新令牌,不如在以后的调用中使用存储的令牌,直到它过期。存储令牌的方式取决于应用程序的特性:典型的解决方案包括数据库(适用于无论是否存在会话都需要执行 API 调用的应用程序)和 HTTP 会话(适用于活动窗口仅限于交互式会话的应用程序) )。有关服务器端存储和令牌重用的示例,请参阅我们的 Github 存储库中的获取和存储访问令牌以调用外部 API


推荐阅读