Единый вход в Microsoft Edge не работает, но работает в IE11, Chrome, Safari, Firefox - через Office. js надстройка - PullRequest
0 голосов
/ 21 января 2020

Следующий код oAuth2 SSO в моем Office. js приложение-надстройка прекрасно работает в IE11, Chrome, Safari и Firefox, но не работает в Microsoft Edge. Я вижу, что токен-носитель возвращается во всплывающее диалоговое окно через URL-адрес:

https://localhost: 3000 / login? Access_token = ya29.ImG6By-0ZWPQB4MsYxxxxxxxxxxxxxxxxxxxxxxxxxxxx5xxsxxxE5XsM9S0BQAXBX5

Я также вижу, что asyncResult.status == успешно выполнено, то есть

[объект объекта]: {статус: "успешно", значение: объект} статус: "успешно"

значение: объект

addEventHandler: function () {var d = OSF.DDA.SyncMethodCalls [OSF.DDA.SyncMethodNames.AddMessageHandler.id], c = d.verifyAndExtractCall (arguments, a, b) , e = c [Microsoft.Office.WebExtension.Parameters.EventType], f = c [Microsoft.Office.WebExtension.Parameters.Handler]; вернуть b.addEventHandlerAndFireQueuedEvent (e, f)} аргументы: нулевой абонент: нулевая длина: 0 имя: "значение"

прототип: объект

proto : function () {[собственный код]}

close: function () {var с = OSF._OfficeAppFactory.getHostFacade () [OSF.DDA.DispIdHost.Methods.CloseDia log]; c (аргументы, g, b, a)}

sendMessage: function () {var c = OSF._OfficeAppFactory.getHostFacade () [OSF.DDA.DispIdHost.Methods.SendMessage]; return c (arguments, b, a)}

proto : Объект

proto : Объект

Однако, "console.log ('hello');" не вызывается, когда Microsoft Edge запускает боковую панель / надстройку.

Всплывающее диалоговое окно показывает это в консоли отладки F12:

HTTP403: FORBIDDEN - сервер понял запрос, но отказывается его выполнить. (XHR) POST - https://browser.pipe.aria.microsoft.com/Collector/3.0/?qsp=true&content-type=application%2Fbond-compact-binary&client-id=NO_AUTH&sdk-version=AWT-Web-JS-1.1.1&x-apikey=a387cfcf60114a43a7699f9fbb49289e-9bceb9fe-1c06-460f-96c5-6a0b247358bc-7238&client-time-epoch-millis=1579626709267&time-delta-to-apply-millis=961

Есть идеи?

export function loginUsingOAuth() {
    try {
        const sealUrl = getFromStorage('seal_url', STORAGE_TYPE.LOCAL_STORAGE);
        const redirectUrl = `${window.location.protocol}//${window.location.host}/login`;

        let displayInIframe = false;
        let promptBeforeOpen = false;

        if (typeof sealUrl !== 'undefined' && sealUrl) {
            const oAuthUrl = `${sealUrl}/seal-ws/oauth2/login?redirect_uri=${redirectUrl}`;

            Office.context.ui.displayDialogAsync(
                oAuthUrl,
                {
                    height: 80,
                    width: 80,
                    displayInIframe,
                    promptBeforeOpen
                },
                asyncResult => {
                    console.log('asyncResult');
                    console.log(asyncResult);
                    addLog(LOG_TYPE.INFO, 'authentication.loginUsingOAuth', asyncResult);
                    if (asyncResult.status !== 'failed') {
                        const dialog = asyncResult.value;

                        dialog.addEventHandler(Office.EventType.DialogMessageReceived, args => {
                            console.log('hello');

Может быть, это проблема маршрутизации при выполнении в Edge? Обратный вызов «/ login» направляется компоненту AuthCallback. js:


const Routes = () => (
    <BrowserRouter>
        <Switch>
            <Route exact path="/login" component={AuthCallback} />
            <Route path="/" component={BaseLayout} />
        </Switch>
    </BrowserRouter>
);

Конструктор компонента AuthCallback. js компонент вызывает messageParent после короткой паузы:

    constructor(props) {
        super(props);
        const paramsObj = queryString.parse(props.location.search);
        const paramsStr = JSON.stringify(paramsObj);
        setTimeout(() => {
            Office.context.ui.messageParent(paramsStr);
        }, 1200);
    }

Я начинаю задумываться, не перебивает ли Edge переадресацию. На изображении ниже видно, что IE и Edge возвращают разные коды состояния для одной и той же операции входа в систему:

enter image description here

1 Ответ

0 голосов
/ 24 января 2020

Кажется, есть две проблемы с браузером Edge.

  1. Перенаправление / обратный вызов не вызывает конструктор компонентов, когда displayInIframe = false при работе в Microsoft Edge. Все остальные браузеры работают как положено. Я добавил условную логику c, чтобы установить displayInIframe = true для варианта использования браузера Edge

  2. Метод messageParent также не работает для браузера Edge, когда displayInIframe = true. Поэтому мне пришлось извлечь токен аутентификации во всплывающем диалоговом окне обратного вызова и поместить его sh в local_storage. Затем родитель (боковая панель) опрашивает local_storage, чтобы определить, что вход выполнен. Опять же, Chrome, Firefox, Safari, IE11 (и Ma c, и P C) все в порядке - это просто сбой браузера Edge.

Хотя это уродливое решение проблемы, оно также несовершенно, поскольку, если конечный пользователь еще не вошел в систему единого входа, то отображается диалоговое окно Google [Account Selector], что является проблемой, когда displayInIframe = true, так как это вызывает исключение iframe.

Я не вижу никакой другой открытой нам опции, потому что номер сборки O / S и версия MSWord определяют, какой браузер используется для отображения боковой панели. Невозможность выбрать, использовать ли IE11 или Edge, была бы терпимой, если бы у Edge не было этих функциональных недостатков.

...