Играть. Сессия становится нулевой после перенаправления с страницы входа google
Я пытаюсь включить граф Google Analytics в веб-приложение, чтобы показать статистику пользователей их приложений. Это локальный url http://192.168.100.10:9000/
я login на панели инструментов (веб-приложение). У меня есть кнопка входа в 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
И когда пользователь нажимает кнопку allow
на странице разрешений входа google, тогда управление возвращается к callback()
![введите описание изображения здесь]()
но на этот раз session("user")
имеет значение null. который не должен быть пустым, потому что я установил сеанс, когда пользователь вошел в систему. Я не знаю, почему это происходит и как это исправить.
И это конечный URL-адрес после перенаправления с страницы разрешения Google.
http://localhost:9000/callback?state=google-35808300&code=4/g-FkJ3GGS01jbeXLHK0o95ks-K-drGK7bxgzvi3cELU#
Ответы
Ответ 1
Это локальный url http://192.168.100.10:9000/...
... & redirect_uri = http://localhost:9000/...
И это конечный URL-адрес после перенаправления с страницы разрешения google http://localhost:9000/...
Исходный URL-адрес отличается от конечного URL-адреса. Это неверно.
Обычно сеанс HTTP на стороне сервера привязан к файлу cookie сеанса. Куки файлы в свою очередь привязаны к определенному имени хоста (IP или домен). Webbrowsers очень строги при отправке файлов cookie на определенное имя хоста. Несмотря на то, что IP-адрес DNS-разрешения в правильном домене, веб-браузеры могут отказаться от отправки файла cookie, созданного по IP-адресу, вместе с запросом на имя домена. В принципе, веб-сервер не будет извлекать первоначально созданный файл cookie сеанса и, следовательно, создает новый.
Затем существуют веб-браузеры, которые отклоняют файлы cookie, чье имя-хост явно установлено на "localhost", например Google Chrome: Chrome не создает cookie для домена = localhost в сломанном https. Браузеры также могут отказаться от файлов cookie, чье имя в явном виде установлено на IP-адрес, поскольку это может вызвать проблемы с безопасностью, когда клиент использует динамический IP-адрес.
Поэтому настоятельно рекомендуется использовать настоящее доменное имя, например example.com
вместо IP-адреса или "localhost". Не покупая его, вы можете подделать его, просто отредактировав файл hosts. Формат каждой строки выглядит следующим образом: сначала добавляется IP-адрес, а затем разделяется пространство требуемых доменов.
127.0.0.1 localhost example.com anotherexample.com
Затем последовательно используйте именно этот домен в течение всего процесса. Начните с http://example.com:9000/...
, используйте &redirect_uri=http://example.com:9000/...
и т.д.
Я не занимаюсь Play Framework, но если вы знакомы с Servlet API, вы можете лучше понять работу сеанса HTTP после прочтения этого связанного Q & A: How работают сервлеты? Создание, сеансы, общие переменные и многопоточность.