Как интегрировать Google Identity Toolkit с приложением для одной веб-страницы (например, GWT)

Мне нужно интегрировать набор инструментов идентификации Google (набор инструментов идентификации Google) с моим приложением Google webtoolkit (GWT).

Однако рендеринг gitkit signInButton или виджета уже не так прост, потому что способ сделать это связан с «window.onload». И мне нужно отобразить виджет позже.

Мне удалось это сделать (см. ниже), но я не доволен этим, и мне интересно, нашел ли кто-то другой лучший способ интеграции.

 private native void showGitKitWidget() /*-{
        $wnd.google.identitytoolkit.signInButton(
            '#gitkitDivId', // accepts any CSS selector
            {
             widgetUrl: "//127.0.0.1:8888/gitkit/signin.html",
             signOutUrl: "/gitkit/signout",
             popupMode: true                    
            }
        );

        var evt = $doc.createEvent('Event');
        evt.initEvent('load', false, false);
        $wnd.dispatchEvent(evt);
    }-*/;

Обновить Фактическое использование параметра popupMode для signInButton делает бесшовную интеграцию еще ближе. Это позволяет виджету всплывать в окне браузера и оставлять окно GWT без изменений. Затем в виджете вместо перенаправления на successUrl я использую обратный вызов JS, чтобы вместо этого вызвать вызов AJAX.

var config = {
            idps: ["googleplus"],
            signInSuccessUrl: '//127.0.0.1:8888/gwt/servlet/gitkit/signedin',          
            callbacks: {
            signInSuccess: function(tokenString, accountInfo,
              opt_signInSuccessUrl) {
                /* !!! Tell GWT parent window that we are ready...
                 I believe using a cookie for which the parent is
                 regularly looking is the way to go, because it
                 will work in mobile browsers too.
                */ 

                return false; // prevents redirect to signInSuccessUrl
              }
           }

Обновить Наконец, родительское окно GWT будет ожидать результат cookie и, если он будет найден, сделать вызов AJAX для signInSuccessUrl. Он также должен будет снова отобразить signInButton, который затем покажет вошедшего в систему пользователя.

Таким образом, единственный уродливый обходной путь — это то, как signInButton визуализируется с использованием вызова метода onload.

Было бы очень полезно, если бы существовал способ динамического отображения signInButton, когда это необходимо, например, если бы существовал метод "$wnd.google.identitytoolkit.update()". Это может быть вызвано в любое время в первый раз, а также должно быть в состоянии обрабатывать изменение статуса входа!

В заключение я ответил на свой вопрос, который может быть полезен другим, но также я хотел бы спросить, есть ли лучший способ, который я пропустил.


person robert    schedule 18.07.2015    source источник
comment
Просто примечание: значение signOutUrl является относительным путем, поэтому оно должно быть /gitkit/signout.   -  person dsalama    schedule 20.07.2015
comment
@dsalama Спасибо. Я очистил URL-адреса и добавил больше информации.   -  person robert    schedule 21.07.2015


Ответы (1)


Как вы заметили, виджет Identity Toolkit в настоящее время должен запускаться при загрузке страницы. Одностраничные приложения (например, созданные с помощью GWT) должны размещать виджет на отдельной странице. Затем вы можете перенаправить пользователя туда - или отобразить через всплывающее окно, как вы заметили, - чтобы войти в систему.

Если отрисовка кнопки входа вызывает проблемы, воспользуйтесь документацией о том, как загрузить виджет напрямую.

person dsalama    schedule 21.07.2015
comment
Если я размещу виджет на отдельной странице (используя параметр mode=select), в конце концов он не сильно будет отличаться от сценария всплывающего окна (который я описываю в обновленном вопросе). Дерек, если бы вы могли просмотреть мое решение и подтвердить, что в настоящее время нет лучшего решения, я был бы рад принять ваш ответ. Также рассмотрите возможность реализации чего-то вроде $wnd.google.identitytoolkit.update(), описанного в вопросе. - person robert; 21.07.2015
comment
Да, ваш способ выглядит лучшим подходом с учетом ограничений. Ваше предложение было должным образом учтено - мы определенно заинтересованы в улучшении интеграции для SPA. - person dsalama; 21.07.2015