spring oauth 2 授权服务器应用与另一个应用共享相同的安全上下文

spring oauth 2 authorization server app share same security context with another app

我有两个授权服务器应用程序spring boot 2.0.5)。

两个授权服务器应用程序类似

用户向请求令牌时,spring将注册为该特定用户创建一个 session,并返回一个 token,使用该令牌,您可以访问应用程序 1[的资源 但是您无法访问应用程序 2.

的资源

我的问题是,当您从应用程序 1 生成令牌时,是否有办法 共享相同的安全上下文,您可以使用它来访问应用程序 2 的资源

您可以做的是在安全方面使您的应用程序无状态。

这是什么意思?

Spring 安全性将不再为新登录的用户生成会话。当用户登录时,你会给他一个令牌(例如 JWT)。每次用户访问安全内容时,he/she 都必须提供一个令牌,您的应用程序将使用 public 或私钥验证该令牌(取决于您将使用的令牌加密类型 - 对称或不对称)。最后,如果您的两个应用程序都具有相同的密钥来验证传入的令牌,则您无需共享任何内容。

一些小技巧:

您在每次访问受保护资源的请求时发送的令牌称为 "access token"。让它 expirable 并让它短暂存在(比如 15 分钟)。为什么?与可以简单删除的会话不同,此令牌不能立即失效。万一有人劫持它,它仍然可以访问受保护的资源。

由于您的 "access token" 是短暂的,用户每 15 分钟登录一次会很烦人。为了延长它的寿命,您可以使用另一种类型的令牌,称为 "refresh token",它可以存储在某些数据库中。只需将其从数据库中删除,即可立即使该令牌失效。因此,即使有人劫持它,用户也可以撤销它,劫持者将无法延长他的会话。

参考文献:Stateless authentication with JWT

我们也面临着类似的问题。 对于网页,我们使用 SSO,它在 clientContext 中缓存令牌并使用 Authorization-server-1

为了调用 API-1,我们使用 Authorization-server-2 生成的令牌。在这种情况下,我们为 clientContext 创建了另一个会话 bean,它是缓存令牌(拥有自己的 oauth2RestTemplate 和 clientCredientialResource) 这是两条腿的场景 我们正在研究如何使用三足方案来调用 web/rest 服务,但我们无法这样做,因为访问令牌检索是两步过程(使用授权代码)并且回调将再次执行整个方法并且在调用休息后不从行继续 api