玩框架。从 google 登录页面重定向后会话变为空
Play framework. Session becomes null after redirection from google sign in page
我正在尝试将 google 分析图合并到 Web 应用程序中以显示其应用程序使用情况的用户统计信息。这是本地 url http://192.168.100.10:9000/
我登录仪表板(网络应用程序)我有一个 google 登录按钮。到目前为止,我在用户登录后维护他的会话。
并且当用户点击登录按钮时。它触发回调方法。当第一次触发回调时,它会保持会话。我的意思是 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);
}
}
这是用户点击登录按钮时的 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()
但这次 session("user")
为空。这不应该为空,因为我在用户登录时设置了会话。我不知道为什么会这样,也不知道如何解决这个问题。
这是从 google 权限页面重定向后的结束 url。
http://localhost:9000/callback?state=google-35808300&code=4/g-FkJ3GGS01jbeXLHK0o95ks-K-drGK7bxgzvi3cELU#
This is the local url http://192.168.100.10:9000/ ...
... &redirect_uri=http://localhost:9000/ ...
And this is the end url after the redirect from google permission page http://localhost:9000/ ...
开始的 URL 与结束的 URL 不同。这是不正确的。
通常,服务器端的 HTTP 会话与会话 cookie 相关联。 Cookie 又与特定的主机名(IP 或域)相关联。 Web 浏览器在将 cookie 发送到特定主机名方面非常严格。即使 IP 将 DNS 解析为正确的域,网络浏览器也可能拒绝发送在 IP 地址上创建的 cookie 以及对域名的请求。基本上,网络服务器不会检索最初创建的会话 cookie,因此会创建一个新的。
然后存在拒绝主机名明确设置为 "localhost" 的 cookie 的网络浏览器,例如 Google Chrome: 。浏览器也可以选择拒绝其主机名明确设置为 IP 地址的 cookie,因为当客户端使用动态 IP 时,这可能会导致安全问题。
因此强烈建议使用 example.com
等真实域名,而不是 IP 地址或 "localhost"。不买一个,你可以通过简单地编辑 hosts file 来伪造一个。每行的格式如下所示,首先是 IP 地址,然后是所需的域 space 分隔。
127.0.0.1 localhost example.com anotherexample.com
然后在整个过程中始终使用该域名。从 http://example.com:9000/...
开始,使用 &redirect_uri=http://example.com:9000/...
等
我不玩 Play Framework,但如果你熟悉 Servlet API,你可能会在阅读相关问答后更好地理解 HTTP 会话的工作方式:How do servlets work? Instantiation, sessions, shared variables and multithreading。
我正在尝试将 google 分析图合并到 Web 应用程序中以显示其应用程序使用情况的用户统计信息。这是本地 url http://192.168.100.10:9000/
我登录仪表板(网络应用程序)我有一个 google 登录按钮。到目前为止,我在用户登录后维护他的会话。
并且当用户点击登录按钮时。它触发回调方法。当第一次触发回调时,它会保持会话。我的意思是 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);
}
}
这是用户点击登录按钮时的 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()
但这次 session("user")
为空。这不应该为空,因为我在用户登录时设置了会话。我不知道为什么会这样,也不知道如何解决这个问题。
这是从 google 权限页面重定向后的结束 url。 http://localhost:9000/callback?state=google-35808300&code=4/g-FkJ3GGS01jbeXLHK0o95ks-K-drGK7bxgzvi3cELU#
This is the local url http://192.168.100.10:9000/ ...
... &redirect_uri=http://localhost:9000/ ...
And this is the end url after the redirect from google permission page http://localhost:9000/ ...
开始的 URL 与结束的 URL 不同。这是不正确的。
通常,服务器端的 HTTP 会话与会话 cookie 相关联。 Cookie 又与特定的主机名(IP 或域)相关联。 Web 浏览器在将 cookie 发送到特定主机名方面非常严格。即使 IP 将 DNS 解析为正确的域,网络浏览器也可能拒绝发送在 IP 地址上创建的 cookie 以及对域名的请求。基本上,网络服务器不会检索最初创建的会话 cookie,因此会创建一个新的。
然后存在拒绝主机名明确设置为 "localhost" 的 cookie 的网络浏览器,例如 Google Chrome: 。浏览器也可以选择拒绝其主机名明确设置为 IP 地址的 cookie,因为当客户端使用动态 IP 时,这可能会导致安全问题。
因此强烈建议使用 example.com
等真实域名,而不是 IP 地址或 "localhost"。不买一个,你可以通过简单地编辑 hosts file 来伪造一个。每行的格式如下所示,首先是 IP 地址,然后是所需的域 space 分隔。
127.0.0.1 localhost example.com anotherexample.com
然后在整个过程中始终使用该域名。从 http://example.com:9000/...
开始,使用 &redirect_uri=http://example.com:9000/...
等
我不玩 Play Framework,但如果你熟悉 Servlet API,你可能会在阅读相关问答后更好地理解 HTTP 会话的工作方式:How do servlets work? Instantiation, sessions, shared variables and multithreading。