一直在用几个墙撞到我的头上,所以希望一些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
我正在尝试根据此线程中的信息将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) 所以,我正在开发一个利用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测试,但同样,我应该能够实现我想要的而不依赖于第三方"插件"等.
所以,我开始玩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) 我正在尝试创建一个表单,其中可以有多个文件上传部分,用户可以在其中上传多个文件。
这部分是相当简单的。我的问题来自允许用户在上传之前从上传列表中“删除”文件。
我创建了一个小提琴来说明
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) 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 ×4
jquery ×3
node.js ×3
adfs ×1
asterisk ×1
asterisk-ari ×1
bandwidth ×1
dynamics-crm ×1
express ×1
getusermedia ×1
kibana ×1
setinterval ×1
webrtc ×1