玩框架。从谷歌登录页面重定向后,会话变为空

时间:2016-07-22 12:33:08

标签: java session playframework google-analytics playframework-2.0

我正在尝试在网络应用中加入谷歌分析图,以显示用户应用程序使用情况的统计数据。这是本地网址http://192.168.100.10:9000/我登录仪表板(网络应用)我有一个谷歌登录按钮。到目前为止,我在登录后维护了用户的会话。

当用户点击登录按钮时。它触发回调方法。当第一次触发回调时,它会保持会话。我的意思是session("user")在这里不为空。

public Result callback() {
    JsonNode jsonNode = Json.parse(session("user"));
    UserDTO userDTO = Json.fromJson(jsonNode, UserDTO.class);

    if (userDTO.getRole().getType().equals(RoleDTO.EnRoleType.ADMIN.toString()))
        return redirect(com.softoven.ultron.controllers.routes.AccountCTRL.index());
    if (request().queryString().get("code") != null && request().queryString().get("state") != null && request().queryString().get("state")[0].equals(session("state"))) { // Check if he/she is authorized
        session().remove("state");
        Analytics analytics = setAnalytics(userDTO, request());
        session("analytics", Json.toJson(analytics).toString());
        return redirect(com.softoven.ultron.controllers.routes.AccountCTRL.index());
    } else {  // Create Authorization URL
        String url = helper.buildLoginUrl();
        session("state", helper.getStateToken());
        return redirect(url);
    }
}

这是用户点击登录按钮时的网址 https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=784122128025-cvq0fn1e23f24dia4soavsd9v1ovesub.apps.googleusercontent.com&redirect_uri=http://localhost:9000/callback&response_type=code&scope=https://www.googleapis.com/auth/analytics.readonly%20https://www.googleapis.com/auth/analytics.manage.users%20https://www.googleapis.com/auth/analytics%20https://www.googleapis.com/auth/analytics.edit%20https://www.googleapis.com/auth/analytics.manage.users.readonly%20https://www.googleapis.com/auth/analytics.provision&state=google-35808300当用户点击Google登录权限页面上的allow按钮时,控制权将返回callback()

enter image description here

但这次session("user")为空。这不应该是null,因为我在用户登录时设置了会话。我不知道为什么会发生这种情况以及如何解决这个问题。

这是从Google权限页面重定向后的结束网址。 http://localhost:9000/callback?state=google-35808300&code=4/g-FkJ3GGS01jbeXLHK0o95ks-K-drGK7bxgzvi3cELU#

1 个答案:

答案 0 :(得分:5)

  

这是本地网址http://192.168.100.10:9000/ ...

     

...& redirect_uri = http://localhost:9000/ ...

     

这是从Google权限页面http://localhost:9000/重定向后的结束网址...

起始网址与结束网址不同。这是不正确的。

通常,服务器端的HTTP会话与会话cookie绑定。 Cookie又与特定主机名(IP或域)绑定。 Web浏览器在向特定主机名发送cookie时非常严格。即使IP将DNS解析到正确的域,webbrowsers也可以拒绝发送在IP地址上创建的cookie以及对域名的请求。基本上,网络服务器不会检索最初创建的会话cookie,因此会创建一个新的会话cookie。

然后存在拒绝其主机名明确设置为" localhost"的Cookie的网络浏览器,例如Google Chrome:Chrome doesn't create cookie for domain=localhost in broken https。浏览器也可以选择拒绝其主机名明确设置为IP地址的cookie,因为这可能会在客户端使用动态IP时导致安全问题。

因此强烈建议使用真实的域名,例如example.com,而不是IP地址或" localhost"。如果不购买,只需编辑hosts file即可伪造一个。每行的格式如下所示,首先是IP地址,然后是所需的域空间分隔。

127.0.0.1 localhost example.com anotherexample.com

然后在整个过程中始终如一地使用该域。从http://example.com:9000/...开始,使用&redirect_uri=http://example.com:9000/...

我不做Play Framework,但如果您熟悉Servlet API,那么在阅读相关的问答语How do servlets work? Instantiation, sessions, shared variables and multithreading后,您可能会更好地理解HTTP会话的工作原理。< / p>