通过Office365登录从后端定位Yammer API

问题描述 投票:0回答:1

这是我的问题:

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

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

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

你可以在这里找到一个实现的例子:qazxsw poi

看起来像 :

Yammer-Java-SDK.

不幸的是,我所针对的Yammer项目被嵌入到Office365中。因此,当我提交原始的yammer登录表单时,我作为响应,Office365登录页面。它可以是正确的:检索office365表格,填写并提交它......但它不是!

借助JavaScript引擎构建office365登录表单。在普通的互联网浏览器中没有问题。但是当我在后端时,我从org.mozilla.rhino(v1.7.10)获得的Javascript引擎无法正确执行脚本...脚本未执行 - >表单不是内置 - >我无法发布 - >我无法检索令牌 - >我无法从我的服务器上发布yammer上的东西...... :(

我已经在我的HttpUnitOptions中启用了脚本:

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();

在那里,我从office365登录页面得到的错误:

引起:com.meterware.httpunit.ScriptException:Script'webpackJsonp([77],{“6Tns”:function(e,t,r){“use strict”; Object.defineProperty(t,“__ esModule”,{value :!0}); var i = function(){}; i.redirectPatterns = [“/ uploaded_files /”],i.prototype = {threadRegex:new RegExp(“threadId =([0-9A-Za-z]] + = {0,3})“,”i“),isForeignRegex:new RegExp(”foreign = true“,”i“),redirectIfNecessary: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,“_ _ esModule”,{value:!0}); var i = function(){}; i.prototype = {redirectIfNecessary:function(e){window.top!= window && window.top.location.replace(e .href)}},t.default = i},vP7g:function(e,t,r){“use strict”; var i = o(r(“Jpbm”)),n = o(r(“6Tns “));函数o(e){return e && e .__ esModule?e:{default:e}}(new i.default).redirectIfNecessary(window.location),(new n.defaul吨).redirectIfNecessary(window.location的)}},[8]);”失败:org.mozilla.javascript.EcmaError:TypeError:不可能的dappelerlaméthode“{1}”de {0}

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

来自:com.meterware.httpunit.javascript.ScriptingEngineImpl

HttpUnitOptions.setScriptingEnabled(true);

Context对象来自:org.mozilla.javascript.Context,这里是它的javadoc:

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

支持不同形式的脚本执行。脚本可以直接从源代码进行评估,也可以先编译然后再执行。还支持交互式执行。

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

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

我真的需要你的帮助。我想解决这3个陈述中的至少一个:

  • 使javascripting工作或:
  • 正确模拟office365登录页面发出的请求或:
  • 完全绕过office365登录,只使用yammer登录

先谢谢你,Stephane

office365 single-sign-on rhino yammer http-unit
1个回答
1
投票

Yammer访问令牌是“长期存在的”,除非明确撤销,否则不会过期。 (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(); } } )。这意味着您只需存储一个访问令牌,并将其用于API。

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

有关如何在后端上下文中使用Yammer API的示例,请查看:link, see section C

© www.soinside.com 2019 - 2024. All rights reserved.