Целевой API Yammer из Back-end через вход в Office365 - PullRequest
0 голосов
/ 16 ноября 2018

вот моя проблема:

С самого начала я хочу использовать API Yammer без каких-либо реальных действий пользователя. Для этого прежде всего мне нужно получить токен.

Для получения токена мне необходимо авторизоваться. Со стороны сервера я использую pacakge com.meterware.httpunit для отправки http-запросов и получения ответов.

Итак, я отправляю запрос GET для получения страницы входа в систему yammer. Затем программно заполняю и отправляю форму авторизации.

Пример реализации можно найти здесь: Yammer-Java-SDK.

Похоже:

WebResponse resp = wc.getResponse(String.format(OAUTH_GET_ACCESS_TOKEN_URL, applicationKey));

// Retrieve, fill and submit Yammer login form
WebForm form = findLoginForm(resp.getForms());
form.setParameter("login", username);
form.setParameter("password", password);

resp = form.submit();

К сожалению, проект Yammer, на который я нацеливаюсь, вставлен в Office365. Поэтому, когда я отправляю исходную форму входа в систему yammer, в качестве ответа у меня появляется страница входа в Office365. Все могло быть в порядке: получить форму office365, заполнить и отправить ее ... но это не так!

Форма входа в office365 создается благодаря движку JavaScript. В обычном интернет-браузере проблем нет. Но когда я на стороне сервера, движок Javascript, который есть у меня из org.mozilla.rhino (v1.7.10), не может правильно выполнить скрипт ... Скрипт не выполняется -> форма не встроенный -> я не могу опубликовать его -> я не могу получить токен-> я не могу опубликовать что-либо на yammer с моего сервера ...: (

Конечно, я включил сценарии в свои HttpUnitOptions:

HttpUnitOptions.setScriptingEnabled(true);

И вот, ошибка, которую я получил со страницы входа в office365:

Вызывается: com.meterware.httpunit.ScriptException: Script «WebpackJsonp ([77], { "6Tns": функция (е, т, г) {" Использование строгий "; Object.defineProperty (т," __ esModule», {значение: 0}); вар я = функция () {}; i.redirectPatterns = [ "/ uploaded_files /"], i.prototype = {threadRegex: новый RegExp ( "ThreadId = ([0-9A-Za-Z] + = {0,3})", "я"), isForeignRegex: новый RegExp ( "иностранный = истина", "я"), redirectIfNecessary: ​​функция (е) { "" == e.hash && (this.isForeign (е) this.redirectToForeign (е): this.redirectWithPatterns (е)) }, redirectWithPatterns: функция (е) {для (вар т = i.redirectPatterns, г = 0, п = t.length; г1)}}, t.default = я}, 8: функция (е, т, г) {e.exports = г ( "vP7g")} , Jpbm: функция (е, т, г) { "использование строгий "; Object.defineProperty (т," __ esModule», {значение: 0}); вар я = функция () {}; i.prototype = {redirectIfNecessary: ​​функция (е) {window.top = окно && window.top.location.replace (e.href)}}, t.default = я}, vP7g: функция (е, т, г) { "использование строгий "; var i = o (r (" Jpbm ")), n = o (r (" 6Tns ")); функция o (e) {return е && е .__ esModule е: {по умолчанию: е}} (новый i.default) .redirectIfNecessary (window.location), (новый n.default) .redirectIfNecessary (window.location)}}, [8]);» не удалось: org.mozilla.javascript.EcmaError: TypeError: Невозможная ошибка метод "{1}" de {0}

Вот функция, где корневое исключение перехватывается и перебрасывается:

из: com.meterware.httpunit.javascript.ScriptingEngineImpl

public String runScript( String language, String script ) {
    if (!supportsScriptLanguage( language )) return "";
    try {
        script = script.trim();
        if (script.startsWith( "<!--" )) {
            script = withoutFirstLine( script );
            if (script.endsWith( "-->" )) script = script.substring( 0, script.lastIndexOf( "-->" ));
        }
        Context context = Context.enter();
        context.initStandardObjects( null );
        context.evaluateString( this, script, "httpunit", 0, null );
        return getDocumentWriteBuffer();
    } catch (Exception e) {
        handleScriptException( e, "Script '" + script + "'" );
        return "";
    } finally {
        discardDocumentWriteBuffer();
        Context.exit();
    }
}

Объект Context происходит от: org.mozilla.javascript.Context , и вот его javadoc:

Этот класс представляет контекст выполнения исполняемого скрипта. Перед выполнением сценария необходимо создать экземпляр Context и связан с потоком, который будет выполнять скрипт. Контекст будет использоваться для хранения информации о выполнении скрипт, такой как стек вызовов. Контексты связаны с текущий поток, использующий методы call (ContextAction) или enter ().

Поддерживаются разные формы выполнения скрипта. Скрипты могут быть оценивается непосредственно из источника или сначала компилируется, а затем позже казнены. Также поддерживается интерактивное выполнение.

Некоторые аспекты выполнения скрипта, такие как преобразование типов и объект создание, могут быть доступны напрямую через методы Context.

В серверной части я попытался смоделировать почтовый запрос, который отправляет страница входа в office365, но пока ... так плохо ...

Мне действительно нужна твоя помощь.Я хотел бы решить хотя бы одно из этих 3 утверждений:

  • Сделать работу javascripting или:
  • Правильно смоделировать запрос, отправленный со страницы входа в office365 или:
  • Чтобы полностью обойти регистрацию в office365 и использовать только yammer один

Заранее спасибо, Стефан

1 Ответ

0 голосов
/ 26 декабря 2018

Токены доступа Yammer являются «долгоживущими» и не имеют срока действия, если их явно не отозвать. ( ссылка, см. Раздел C ). Это означает, что вы можете просто сохранить один токен доступа и использовать его против API.

При просмотре страницы регистрации приложения вы сможете сгенерировать токен разработчика на одной из страниц настроек. Используйте это.

В качестве примера того, как я использовал API-интерфейсы Yammer в внутреннем контексте, проверьте это: https://derekgusoff.wordpress.com/2017/10/31/create-a-yammer-group-with-microsoft-flow/

...