Играть. Сессия становится нулевой после перенаправления с страницы входа 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 работают сервлеты? Создание, сеансы, общие переменные и многопоточность.