Откройте всплывающее окно потока кода авторизации, получите токен и используйте его одним нажатием кнопки

Я работаю над интеграцией ServiceNow со сторонней системой. Используя эту интеграцию, пользователь может получить данные из сторонней системы и использовать их для создания билета запроса на обслуживание. Для этой интеграции мы создали виджет на Сервисном портале. Эта интеграция использует поток кода авторизации для аутентификации.

Виджет является частью элемента каталога, который пользователь может запросить на Сервисном портале. Итак, поток такой:

  1. Пользователь входит в сервисный портал и выбирает элемент.

  2. Пользователь выбирает запись в поле ссылки на элемент. Этот элемент также имеет кнопку, при нажатии на которую пользователь получает всплывающее окно авторизации, в котором появляется сторонний интерфейс входа в систему. Он вводит свои учетные данные для сторонней системы. Если аутентификация прошла успешно, всплывающее окно закрывается, а токены сохраняются в таблице ServiceNow oauth_credential.

Что происходит за сценой, так это то, что я использую функцию ServiceNow «Получить токен OAuth» из модуля ServiceNow «REST message». Смотри ниже:

HTML

 <button type="button" ng-click="checkAccess()" class="btn btn-default">Check Access</button>

Клиентский скрипт

$scope.authorize = function() {
  glideUserSession.loadCurrentUser().then(function(currentUser) {
    var oauthRequestorSysId = currentUser.userID;
    var oauthRequestorContext = 'sys_user';
    var oauthProfileId = '59f05d7ddbf563003ca7da11cf961962';
    var redirect = "https://dev000.service-now.com/oauth_redirect.do";

    var oauth_initiator_url = '/oauth_initiator.do' +
    '?oauth_requestor_context=' + oauthRequestorContext +
    '&oauth_requestor=' + oauthRequestorSysId +
    '&oauth_provider_profile=' + oauthProfileId +
    '&response_type=code';

     window.open(oauth_initiator_url, "", "height=500,width=800");

     // additional code to use token once popup closes
  });
}

Я могу добиться этого до сих пор. Это всплывающее окно сохраняет токены в ServiceNow.

Проблема:

Как только происходит авторизация и всплывающее окно закрывается, страница обновляется. Я не хочу, чтобы страница обновлялась, потому что предыдущий выбор, сделанный пользователем в поле ссылки, теряется при обновлении страницы. У меня есть больше кода в той же функции авторизации, где я буду использовать токен, сгенерированный всплывающим кодом авторизации. Но проблема в том, что если я добавлю код после всплывающего окна, всплывающее окно откроется, но затем оно приостановится и будет выполнена следующая строка кода. Кажется, что всплывающее окно асинхронно. Дополнительные функции кода используют токен, сгенерированный всплывающим окном, для получения данных из сторонней системы. Я не могу создать две кнопки, одну для авторизации, а другую для использования токенов. Я должен сделать это одним нажатием кнопки.

Могу ли я остановить обновление страницы после закрытия всплывающего окна? Могу ли я добавить некоторую логику после строки всплывающего окна, и эта логика должна выполняться только после закрытия всплывающего окна.


person code_fish    schedule 28.11.2018    source источник
comment
Проверьте это, возможно, это будет полезно:success.salesforce.com/answers?id=90630000000hmIIAAY   -  person I_Al-thamary    schedule 01.12.2018
comment
Добавьте в конце функции: return false;   -  person I_Al-thamary    schedule 01.12.2018


Ответы (2)


Это всего лишь предположение, так как у меня нет вашего кода.

Поскольку вы сказали, что страница перезагружается при закрытии всплывающего окна, должен быть какой-то код, который перезагружает страницу, поскольку это не произойдет автоматически. Код может находиться в обработчике события «сообщение», который запускается с помощью «postMessage» (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) во всплывающем окне. Вы можете удалить логику перезагрузки оттуда.

Or

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

person Satpal Tanan    schedule 04.12.2018

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

person code_fish    schedule 10.12.2018