Совместно использовать текущие данные пользователя между поддоменами в Google App Engine для Java - PullRequest
4 голосов
/ 21 марта 2012

Я использую Google App Engine для Java и хочу иметь возможность обмениваться данными сеанса между поддоменами:

  • www.myapp.com
  • user1.myapp.com
  • user2.myapp.com

Причина, по которой я нуждаюсь в этом, заключается в том, что мне нужно иметь возможность определять, вошел ли пользователь на www.myapp.com при попытке доступа к user1.myapp.com. Я хочу сделать это, чтобы дать им возможности администратора на своих собственных поддоменах, а также позволить им беспрепятственно переключаться между поддоменами без необходимости повторного входа в систему.

Я готов поделиться всеми данными cookie между поддоменами, и это возможно с помощью Tomcat, как показано здесь: Обмен данными сеанса между 2 поддоменами

Возможно ли это с помощью App Engine на Java?

<ч /> Обновление 1

Я получил хороший совет, что могу поделиться информацией, используя cookie, с доменом, установленным в «.myapp.com». Это позволяет мне установить что-то вроде «current_user» в «4» и иметь доступ к этому на всех поддоменах. Тогда мой серверный код может отвечать за проверку файлов cookie, если у пользователя нет активного сеанса.

Это по-прежнему не позволяет мне получить доступ к исходному сеансу (что может показаться невозможным).

Теперь я беспокоюсь о безопасности. Должен ли я разрешить пользователю проходить проверку подлинности исключительно на основании того, что cookie («current_user» == user_id)? Это кажется очень небезопасным, и я, конечно, надеюсь, что что-то упустил.

1 Ответ

0 голосов
/ 16 марта 2015

Общий cookie - самый оптимальный способ для вашего случая. Но вы не можете использовать его, чтобы поделиться сессией на appengine. За исключением случая, когда у вас есть сторонняя служба для хранения сеансов, например, Redis, развернутая в облачных инстансах.

Вам также необходимо добавить некоторую аутентификацию в ваш файл cookie. В криптографии есть специальная вещь, называемая кодом аутентификации сообщений ( MAC ), или, как правило, HMAC .

В основном вам нужно хранить user id + хеш-код этого id и secret key (известный обоим серверам, но не пользователю). Поэтому каждый раз вы можете проверить, предоставил ли пользователь действительный идентификатор, например:

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);

Взгляните также на TokenBasedRememberMeServices из Spring Security, вы можете использовать его в качестве примера.

...