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

时间:2012-03-20 21:23:57

标签: java google-app-engine session subdomain

我正在使用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

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

这仍然不允许我访问原始会话(看起来可能无法访问)。

我现在担心的是安全问题。我是否应该允许用户完全根据cookie(“current_user”== user_id)的事实进行身份验证?这似乎非常不安全,我当然希望我错过了一些东西。

1 个答案:

答案 0 :(得分:0)

共享Cookie是您案例的最佳方式。但你不能用它来共享一个关于appengine的会话。除了您有第三方服务来存储会话的情况,例如Redis部署到云实例。

您还需要为Cookie添加一些身份验证。在密码学中,有一种称为消息认证码(MAC)的特殊事物,或者通常是HMAC

基本上你需要存储user id +这个idsecret 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);

另请参阅Spring Security的TokenBasedRememberMeServices,您可以将其作为示例使用。