小编An0*_*d3r的帖子

如何从Web App(节点/ Express)查询本地Dynamics CRM

一直在用几个墙撞到我的头上,所以希望一些CRM/Dynamics专家可以帮我一臂之力!

我正在尝试以编程方式从我们的Dynamics CRM实例中获取数据,在Node支持的Express应用程序中使用一组管理凭据.此Express应用程序托管在托管CRM的网络之外的单独服务器上.然后,应用程序将请求,处理并将CRM数据提供给任何已访问的用户(由应用程序中的角色/权限控制),这意味着最终用户只需登录Express应用程序,而无需登录通过ADFS,以便应用程序访问CRM实例.

我们的CRM设置是一个配置为面向互联网(IFD)的内部部署服务器.这使用Active Directory联合身份验证服务.我们的Web应用程序代理服务器在网络的外围运行联合服务,与内部网络上的ADFS服务器进行通信.ADFS对从网络外部(从Internet)连接到内部AD的用户进行身份验证.经过身份验证后,代理允许用户连接到CRM.

我们的本地活动目录与Azure AD同步,因为我们有混合部署.任何O365服务(在线交换,共享点等)都在后台使用Azure AD.我们同步Active目录,因此我们只需要在一个地方管理用户.

CRM有一个端点,例如https://my.crm.endpoint,我在Azure门户中注册了一个应用程序(称为CRM App),主页设置为CRM端点https://my.crm.endpoint.

问题是否将应用程序的主页设置为https://my.crm.endpoint足以将其"链接"到我们的内部CRM实例?

我编写了一个脚本(crm.js),它使用它的应用程序ID 成功请求在Azure门户中注册的CRM应用程序的访问令牌.

示例令牌

eyJ0dWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzE5ZTk1...
Run Code Online (Sandbox Code Playgroud)

然后,我使用持票令牌尝试通过通常的端点从Dynamics获取一些联系人:https://my.crm.endpoint/api/data/v8.2/contacts?$ select = fullname,contactid

这失败了,我收到一条401 Unauthorised错误消息.

问题任何人都可以建议问题是什么?和/或提供有关如何连接Web应用程序(在我的案例中为Express)的详细信息,以便对使用ADFS的内部部署服务器(IFD)上运行的Dynamics CRM进行身份验证请求?

crm.js

let util = require('util');
let request = require("request");

let test = {
    username: '<my.email@address.com>',
    password: '<my_password>',
    app_id: '<app_id>',
    secret: '<secret>',
    authenticate_url: 'https://login.microsoftonline.com/<tenant_id>/oauth2/token',
    crm_url: 'https://<my.crm.endpoint>'
};
function CRM() { }

CRM.prototype.authenticate = function () {
    return new Promise((resolve, reject) => { …
Run Code Online (Sandbox Code Playgroud)

microsoft-dynamics adfs dynamics-crm node.js azure-active-directory

20
推荐指数
1
解决办法
1616
查看次数

使用cookie iFraming Kibana仪表板时出现TOO_MANY_REDIRECTS错误

我正在尝试根据此线程中的信息将iFrame中受密码保护的Kibana仪表板嵌入到我的Node驱动的Express应用程序中.Kibana使用X-Pack进行保护,并要求用户登录以查看其可视化数据.

这当前要求用户登录两次,一次登录应用程序并再次访问Kibana仪表板,这不是目标.

根据这个帖子中的信息,我实现了一些代码,这些代码在飞行前的POST请求https://elk-stack.my.domain:5601/api/security/v1/login中获取cookie

这个客户端请求......

function preFlightKibanaAuth () {
    ...
    $.ajax({
      type: 'POST',
      url: '/kibana-auth',
      datatype: 'json',
      success: function (response) {
        if (response && response.authenticated) {
          $('iframe#kibana-dashboard').prop('src', 'https://elk-stack.my.domain:5601/s/spacename/app/kibana#/dashboards?_g=()')
        }
      },
      error: function (err) {
        console.log(err)
      }
    })
  }
Run Code Online (Sandbox Code Playgroud)

被路由到这条路线......

router
  .route('/kibana-auth')
  .post((req, res, next) => {
    ... 
    if (authorised) {
      ...
      authenticateKibana(req)
          .then(cookie => {
            if (cookie && cookie.name && cookie.value) {
              res.set('Set-Cookie', `${cookie.name}=${cookie.value}; Domain=my.domain; Path=/; Secure; HttpOnly`)
              res.send({ 'authenticated': true })
            } else {
              res.send({ 'authenticated': …
Run Code Online (Sandbox Code Playgroud)

node.js express elasticsearch kibana elasticsearch-x-pack

14
推荐指数
1
解决办法
374
查看次数

WebRTC:如何计算RTC对等连接的用户带宽/网络延迟

所以,我正在开发一个利用WebRTC在同行之间提供视频/音频通信的应用程序.

我想向用户提供一些关于他们的网络连接/带宽/延迟等的反馈,以便在带宽等可怕的情况下建议可能的解决方案.

WebRTC有一个getStats()API,它提供了许多关键信息.当对等连接处于活动状态时,getStats()给我以下对象...

{
    "googLibjingleSession_5531731670954573009":{
        "id":"googLibjingleSession_5531731670954573009",
        "timestamp":"2016-02-02T11:14:43.467Z",
        "type":"googLibjingleSession",
        "googInitiator":"true"
    },
    "googTrack_SCEHhCOl":{
        "id":"googTrack_SCEHhCOl",
        "timestamp":"2016-02-02T11:14:43.467Z",
        "type":"googTrack",
        "googTrackId":"SCEHhCOl"
    },
    "ssrc_360347109_recv":{
        "id":"ssrc_360347109_recv",
        "timestamp":"2016-02-02T11:14:43.467Z",
        "type":"ssrc",
        "googDecodingCTN":"757",
        "packetsLost":"0",
        "googSecondaryDecodedRate":"0",
        "googDecodingPLC":"3",
        "packetsReceived":"373",
        "googExpandRate":"0.00579834",
        "googJitterReceived":"0",
        "googDecodingCNG":"0",
        "ssrc":"360347109",
        "googPreferredJitterBufferMs":"20",
        "googSpeechExpandRate":"0.00140381",
        "googTrackId":"SCEHhCOl",
        "transportId":"Channel-audio-1",
        "googDecodingPLCCNG":"10",
        "googCodecName":"opus",
        "googDecodingNormal":"744",
        "audioOutputLevel":"6271",
        "googAccelerateRate":"0",
        "bytesReceived":"21796",
        "googCurrentDelayMs":"64",
        "googDecodingCTSG":"0",
        "googCaptureStartNtpTimeMs":"-1",
        "googPreemptiveExpandRate":"0.00292969",
        "googJitterBufferMs":"42"
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这些信息,我希望能够计算出用户......

a)带宽(理想情况下音频和视频分开但直接带宽就足够了)

b)网络延迟

提前致谢...

注意:我已经看过这个包装器,但我希望能够自己做到这一点(当然有一点你的帮助:D)因为这个包装器的示例代码使用了一个"bytesSent"属性,我不知道好像回来了getStats()

我也知道GitHub上可用的WebRTC测试,但同样,我应该能够实现我想要的而不依赖于第三方"插件"等.

javascript jquery bandwidth webrtc getusermedia

5
推荐指数
1
解决办法
2438
查看次数

节点ARI客户端| 连接方法没有触发回调?

所以,我开始玩Asterisk Restful Interface(ARI).

我创建了一个单独的快速应用程序来执行此操作.

我有一个正确配置的Asterisk 13运行实例.我知道这一点因为当我进入https://192.168.46.122:8088/ari/sounds浏览器时,系统会提示我输入用户名和密码,输入后会返回一个有效的JSON对象,其中包含预期的数据...

[
  {
    "id": "conf-now-unmuted",
    "text": "The conference is now unmuted.",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "vm-nomore",
    "text": "No more messages.",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "vm-review",
    "text": "press 1 to accept this recording press 2 to listen to it press 3 to rerecord your message",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "demo-echodone", …
Run Code Online (Sandbox Code Playgroud)

javascript asterisk node.js asterisk-ari

5
推荐指数
1
解决办法
897
查看次数

多个文件上传-带有“删除文件”链接

我正在尝试创建一个表单,其中可以有多个文件上传部分,用户可以在其中上传多个文件。

这部分是相当简单的。我的问题来自允许用户在上传之前从上传列表中“删除”文件。

我创建了一个小提琴来说明
http://jsfiddle.net/alexjamesbrown/o62srbew/

我有一排简单的内容 <input type="file"

<div class="row files" id="files1">
    <h2>Files 1</h2>
    <span class="btn btn-default btn-file">
        Browse  <input type="file" name="files1" multiple />
    </span>
    <br />
    <ul class="fileList"></ul>
</div>
Run Code Online (Sandbox Code Playgroud)

然后,到目前为止,我已经创建了一个jquery插件,因此它可以重复使用:

$.fn.fileUploader = function (filesToUpload) {
    this.closest(".files").change(function (evt) {

        for (var i = 0; i < evt.target.files.length; i++) {
            filesToUpload.push(evt.target.files[i]);
        };
        var output = [];

        for (var i = 0, f; f = evt.target.files[i]; i++) {
            var removeLink = "<a href=\"#\" data-fileid=\"" + i + "\">Remove</a>";

            output.push("<li><strong>", escape(f.name), "</strong> - ", …
Run Code Online (Sandbox Code Playgroud)

javascript jquery

3
推荐指数
1
解决办法
7233
查看次数

JavaScript - setInterval只运行一次

http://jsfiddle.net/689nauny/

setInterval()只运行一次...... WTF正在进行中?

SO正在询问更多细节,但提供一个JSFiddle就像我可以描述一样?我尝试过使用匿名函数,现在又回调了.我只是不明白吗?: - /

HTML

<script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>

<div id="qanda-timer-container">
    <div class="qanda-timer">
        <span id="qanda-time-remaining"></span>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

JS

    function intervalFunc(thinkingTime, answerTime)
    {
        jQuery('#qanda-time-remaining').text(''+(thinkingTime - 1));
    }

    function enableTimer(time)
    {
        var intervalID;
        var hasThinkingTime = true;
        var thinkingTime = time;

        var hasAnswerTime = true;
        var answerTime = 10;

        if(hasThinkingTime && hasAnswerTime)
        {
            setInterval( intervalFunc(thinkingTime, answerTime), 1000);
        }

        setTimeout(function(){ 

            clearInterval(intervalID);

        }, time * 1000);
    }

enableTimer(30);
Run Code Online (Sandbox Code Playgroud)

javascript jquery setinterval

1
推荐指数
1
解决办法
1259
查看次数