Ошибка перенаправления входа в App Engine - PullRequest
1 голос
/ 27 марта 2011

1 марта 2011 г. App Engine изменил поток входа в систему, сломав мое приложение (см. Группы Google сообщение ). Эта проблема также возникла в этом стеке Переполнение вопрос . Предлагаемые ответы

"чтобы приложение выполняло перенаправление. То есть createLoginUrl работает только тогда, когда продолжить URL-адрес URL для приложения. Если вам нужно, чтобы пользователь был отправлен другое приложение / хост после входа в систему, тогда ваше приложение должно сделать это перенаправление "

и

"установить обработчик перенаправления в вашем собственном приложении. Сделать это целью параметра continue, и он отправит окончательный редирект на ваш фактическая цель ".

Я задаю этот вопрос, чтобы получить подробную информацию о том, как сделать эту работу. Мое приложение состоит из двух приложений GAE, внешнего интерфейса GWT и внутреннего интерфейса, предоставляющего REST API. Вот текущий поток.

Пользователь переходит на http://my -front.appspot.com / , и GWT делает Вызов JSONP для http://my -back.appspot.com / пользователя сервлет.

Сервлет / User проверяет GAE UserServiceFactory.getUserService (). GetCurrentUser (), чтобы увидеть, если это ноль. Для пользователей, не вошедших в систему, это значение равно NULL, и сервлет возвращает JSONP, что пользователь не вошел в систему.

GWT-код получает сообщение «не авторизован» и делает

String login = "http://my-back.appspot.com/Login";
Window.open(login, "_self", "");

Сервлет входа в систему:

public void doActualGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {

    UserService userService = UserServiceFactory.getUserService();
    String url = "http://my-back.appspot.com/LoginRedirectServlet";
    // String url ="http://my-front.appspot.com";  <--------- Before 1 March
    log.info("Auth then redirect to: " + url);
    String redirect = userService.createLoginURL(url);
    resp.setStatus(301);
    resp.setHeader("Location", redirect);
    resp.setHeader("Connection", "close");
}

Мой новый LoginRedirectServlet имеет одну строку:

resp.sendRedirect("http://my-front.appspot.com/");

Обычно это приводит к циклу перенаправления, хотя иногда после нескольких нажатий на исходный URL-адрес это работает. Я подозреваю, что в коде около Window.open что-то не так, но я открыт для всех предложений.

Спасибо, Гленн

Ответы [ 2 ]

0 голосов
/ 30 марта 2011

Благодарю Ника Джонсона за то, что он скулил об архитектуре двух приложений. Мне никогда не нравилось это. Я переместил war / MyFront.html и скомпилированный код GWT в war / myfront / в файл war проекта myback, изменил все URL-адреса на форму http://my -back.appspot.com / и развернул , Это сработало!

Это просто взлом, но это подтверждает принцип.

0 голосов
/ 28 марта 2011

Попробуйте использовать Window.Location.assign(url) вместо Window.open(..).

Обновление:

Возможная проблема: ваш браузер кэширует 301 редирект (например, Chrome делает это).Поскольку ваш сервлет входа в систему производит перенаправление, и в случае кеширования это создаст цикл.Попробуйте использовать другой код перенаправления: 302 или 307.

...