Spring Session / OAuth2多租户应用程序/多个cookie

时间:2019-01-17 20:37:52

标签: spring spring-boot session cookies oauth-2.0

我使用Spring Session和OAuth2为多租户应用程序构建SSO,并拥有一个具有不同前端客户端和后端服务器的应用程序。 (我使用了本教程https://www.baeldung.com/sso-spring-security-oauth2)。
因此,现在的问题是,每个客户端(租户)都与后端服务器在不同的域上运行,因此后端服务器只有一个cookie,并且用户无法同时登录两个不同的租户。 (每个租户都有不同的承载令牌,因此只有cookie是问题)
这个想法原本是要以某种方式配置spring以便在服务器上也创建一个不同的SESSION cookie(我没有设法这样做/甚至不知道这样做是否可行)
另外,由于我使用的是基于令牌的身份验证,因此我不明白为什么需要该Cookie。
我确实了解,如果我要在用户关闭浏览器并再次打开浏览器时自动登录,那我需要在客户端保存一些数据(例如Cookie),但是为什么要使用JSESSIONID而不选择将不记名令牌保存在cookie中)
另外,我确实相信在登录过程之后,会话cookie用于授权,而不是oAuth令牌。 (我从令牌存储+刷新令牌中删除了它,并在下一个请求中仅创建了一个新令牌)

所以基本上我想知道的是:

  • 我可以以某种方式配置后端以为每个租户创建一个cookie吗? (不运行它的多个实例)
  • 我为什么需要会话cookie?
  • 从令牌存储中删除令牌后,如何在oAuth中对用户进行重新认证,而不必再次输入密码(我认为会话cookie负责该操作)

我的Yaml配置看起来像这样:

server:
port: 8082
servlet:
    context-path: /ui
session:
  cookie:
    name: UISESSION
security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: SampleClientId
      clientSecret: secret
      accessTokenUri: http://localhost:8081/auth/oauth/token
      userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
    resource:
      userInfoUri: http://localhost:8081/auth/user/me
    client2:
      clientId: SampleClientId
      clientSecret: secret
      accessTokenUri: http://localhost:8081/auth/oauth/token
      userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
    resource:
      userInfoUri: http://localhost:8081/auth/user/me

1 个答案:

答案 0 :(得分:0)

OAuth2的工作方式如下:

OAuth2 Flow

访问令牌仅授予该租户,不能用于访问其他租户的资源。

租户网站随后需要存储此访问令牌以供以后使用,它可以存储在以下位置:

  1. Cookie-您没有问题,因为每个租户都有不同的域。
  2. 本地存储-您没有问题,因为它也是不同的存储。

SESSIONID是由Spring创建的cookie,在这种情况下将不使用。