通过Office365登录,从后端瞄准Yammer API

通过Office365登录,从后端瞄准Yammer API,office365,single-sign-on,rhino,yammer,http-unit,Office365,Single Sign On,Rhino,Yammer,Http Unit,我的问题是: 从后端来看,我希望使用Yammer API,而不需要任何实际的用户操作。要做到这一点,首先我必须检索一个令牌 要检索令牌,我必须登录。在后端,我使用com.meterware.httpunit包发送http请求并接收响应 因此,我发出GET请求来检索yammer登录页面。 然后,以编程方式填写并提交登录表单 您可以在此处获得一个实现示例: 它看起来像: WebResponse resp = wc.getResponse(String.format(OAUTH_GET_ACCESS_

我的问题是:

从后端来看,我希望使用Yammer API,而不需要任何实际的用户操作。要做到这一点,首先我必须检索一个令牌

要检索令牌,我必须登录。在后端,我使用com.meterware.httpunit包发送http请求并接收响应

因此,我发出GET请求来检索yammer登录页面。 然后,以编程方式填写并提交登录表单

您可以在此处获得一个实现示例:

它看起来像:

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引擎构建的。在普通的互联网浏览器中没有问题。但是当我在后端时,我从org.mozilla.rhino(v1.7.10)获得的Javascript引擎无法正确执行脚本。。。脚本未执行->表单未生成->我无法发布->我无法检索令牌->我无法从我的服务器在yammer上发布内容…:(

对于crouse,我已在我的HttpUnitOptions中启用了脚本:

HttpUnitOptions.setScriptingEnabled(true);
在这里,我从office365登录页面得到了一个错误:

原因:com.meterware.httpunit.ScriptException:脚本 'webpackJsonp([77],{“6Tns”:函数(e,t,r){“使用” strict“Object.defineProperty(t,“\uu esModule”{value:!0});var i=function(){};i.redirectPatterns=[“/upload_files/”],i.prototype={threadRegex:new RegExp(“threadId=([0-9A-Za-z]+={0,3})”,“i”),isForeignRegex:new RegExp(“foreign=true”,“i”),redirectIfRequired:function(e){“”!==e.hash&&(this.isForeign(e)?this.redirectToForeign(e):this.redirectWithPatterns(e)),redirectWithPatterns:function(e){for(var t=i.redirectPatterns,r=0,n=t.length;r1)},t.default=i},8:function(e,t,r){e.exports=r(“vP7g”)},Jpbm:function(e,t,r){use strict“Object.defineProperty(t,“\uu esModule”{value:!0});var i=function(){};i.prototype={redirectifneedly:function(e){window.top!=window&&window.top.location.replace(e.href)}},t.default=i},vP7g:function(e,t,r){“使用 严格的;var i=o(r(“Jpbm”)、n=o(r(“6Tns”);函数o(e){return e&&e.uu-esModule?e:{default:e}}(新) i、 默认)。如果需要重定向(窗口位置),(新建 n、 默认设置)。RedirectIfEssential(window.location)},[8]);'失败: org.mozilla.javascript.EcmaError:TypeError:Impossible dappeler la méthode“{1}”de{0}

这里是捕获和重新捕获根异常的函数:

from:com.meterware.httpunit.javascript.ScriptingEngineImpl

公共字符串运行脚本(字符串语言,字符串脚本){
如果(!supportsScriptLanguage(language))返回“”;
试一试{
script=script.trim();
如果(script.startsWith(“”)script=script.substring(0,script.lastIndexOf(“-->”);
}
Context=Context.enter();
context.initStandardObjects(null);
evaluateString(这个,脚本,“httpunit”,0,null);
返回getDocumentWriteBuffer();
}捕获(例外e){
handleScriptException(e,“脚本“+”脚本“+”);
返回“”;
}最后{
丢弃文档WriteBuffer();
Context.exit();
}
}
上下文对象来自:org.mozilla.javascript.Context,下面是它的javadoc:

此类表示正在执行的脚本的运行时上下文。 在执行脚本之前,必须创建一个上下文实例并 与将要执行脚本的线程关联 上下文将用于存储有关执行 脚本,如调用堆栈。上下文与 使用调用(ContextAction)或enter()方法的当前线程

支持不同形式的脚本执行。脚本可能是 直接从源代码计算,或先编译,然后再编译 已执行。还支持交互式执行

脚本执行的某些方面,例如类型转换和对象 创建,可以通过上下文方法直接访问

在后端,我试图模拟office365登录页面发出的post请求,但到目前为止……太糟糕了

我真的需要你的帮助。我想解决以下三种说法中的至少一种:

  • 让javascripting工作起来 或:
  • 正确模拟从office365登录页面发出的请求 或:
  • 完全绕过office365登录,只使用yammer登录
提前感谢您,Stephane

Yammer访问令牌是“长寿命”的,除非明确撤销,否则不会过期。(。这意味着您只需存储一个访问令牌,然后针对API使用即可

当您查看应用程序的注册页面时,您应该能够在其中一个设置页面上生成开发者令牌。请使用该令牌


有关我如何在后端环境中使用Yammer API的示例,请查看:

Yeah..这正是我所做的,但我希望实现一个解决方案,根据常规OAuth流自动检索令牌。无论如何,感谢您的时间;)
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();
    }
}