Мне нужно интегрировать набор инструментов идентификации 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()". Это может быть вызвано в любое время в первый раз, а также должно быть в состоянии обрабатывать изменение статуса входа!
В заключение я ответил на свой вопрос, который может быть полезен другим, но также я хотел бы спросить, есть ли лучший способ, который я пропустил.