在 Google App Engine for Java 上的子域之间共享当前用户数据

Sam*_*rds 5 java subdomain session google-app-engine

我正在使用 Google App Engine for Java,并且希望能够在子域之间共享会话数据:

  • www.myapp.com
  • user1.myapp.com
  • user2.myapp.com

我需要这样做的原因是我需要能够检测到用户在尝试访问 user1.myapp.com 时是否登录了 www.myapp.com。我想这样做是为了给他们自己的子域的管理能力,并允许他们在子域之间无缝切换而无需再次登录。

我愿意在子域之间共享所有 cookie 数据,这可以使用 Tomcat 实现,如下所示:Share session data between 2 subdomains

使用 Java 中的 App Engine 可以做到这一点吗?


更新 1

我得到了一个很好的提示,我可以使用域设置为“.myapp.com”的 cookie 来共享信息。这允许我将“current_user”之类的内容设置为“4”,并可以在所有子域上访问它。如果用户没有活动会话,我的服务器代码可以负责检查 cookie。

这仍然不允许我访问原始会话(这似乎不可能)。

我现在关心的是安全。我是否应该仅根据 cookie ("current_user" == user_id) 对用户进行身份验证?这似乎非常不安全,我当然希望我错过了一些东西。

Igo*_*nov 0

共享 cookie 是适合您情况的最佳方式。但您不能使用它在 appengine 上共享会话。除非您有第三方服务来存储会话,例如部署到云实例的 Redis。

您还需要向 cookie 添加一些身份验证。在密码学中有一种特殊的东西,称为消息验证码(MAC),或者最常见的是HMAC

基本上你需要存储user idthisid和 a的 + 哈希secret key(两个服务器都知道,但用户不知道)。因此,每次您都可以检查用户是否提供了有效的 ID,例如:

String cookie = "6168165_4aee8fb290d94bf4ba382dc01873b5a6";
String[] pair = cookie.split('_');
assert pair.length == 2
String id = pair[0];
String sign = pair[1];
assert DigestUtils.md5Hex(id + "_mysecretkey").equals(sign);
Run Code Online (Sandbox Code Playgroud)

还可以看看TokenBasedRememberMeServicesSpring Security,您可以使用它作为示例。