2015-01-25 10 views
1

Я пытаюсь создать простой клиент для Lync с помощью Nodejs. Основание на http://ucwa.lync.com/documentation/KeyTasks-CreateApplication Я сделал подобное. Работает до последнего шага №9, когда я должен зарегистрировать свое приложение с помощью UCWA. Сервер отвечает с кодом 500 и глупым объяснениемUCWA Lync аутентификация - 500 веб-билет недействителен

Существует проблема с ресурсом, которого вы ищете, и он не может быть отображен

И заголовки

X-MS-диагностика «: '28032; источник = "MySource"; причина = "веб-билет недействителен."'

var http = require('request-promise'); 
var lync = {}; 

lync.setup = function(email, password){ 
    var self = this; 
    var hostname = email.split('@'); 
    this.username = email; 

    //discover urls 
    return http.get('http://lyncdiscover.'+hostname[1]) 
     .then(function(d) { 
      var parsed = JSON.parse(d); 
      self.urls = { 
       self: parsed._links.self.href, 
       user: parsed._links.user.href, 
       xframe: parsed._links.xframe.href 
      }; 
      return http.get(self.urls.user); 
     }).catch(function(err){ 
      if(err.statusCode == 401){ 
       var toParse = err.response.headers['www-authenticate']; 
       var Oauth = toParse.match(/https:\/\/[\d\w\./_-]*/i)[0]; 

       var loginPost = { 
        grant_type: 'password', 
        username: email, 
        password: password 
       }; 

       return http.post(Oauth, {form:loginPost}); 
      } 
      return false 
     }).then(function(data){ 
      var parsed = JSON.parse(data); 
      //setup authorization 
      http = http.defaults({ 
       headers: {Authorization: parsed.token_type + ' ' + parsed.access_token} 
      }); 
      //console.log(self.urls.user); 
      //console.log('Authorization:'+ parsed.token_type + ' ' + parsed.access_token); 
      return http.get(self.urls.user); 

     }).then(function(data){ 
      var parsed = JSON.parse(data); 
      self.urls.applications = parsed._links.applications.href; 

      var registerApp = { 
       culture : "en-us", 
       endpointId : "2d9dc28d-4673-4035-825c-feb64be28e4e", 
       userAgent : "Test" 
      }; 
      var r = "{'userAgent': 'NodeJs', 'endpointId' : '2d9dc28d-4673-4035-825c-feb64be28e4e', 'culture': 'en-US'}"; 
      return http.post(self.urls.applications, {body: registerApp, json:true}); 
     }) 
     .then(function(data){ 
      console.log(data); 
     }) 
     .catch(function(err){ 

      console.log(err); 
      return false; 
     }); 
}; 



//run app 
lync.setup('[email protected]', 'password').then(function(ret){ 

}); 

Один ключевой пункт здесь. Это не мой сервер. У меня просто есть учетная запись, и я могу войти в систему с официальным клиентом Lync или плагином Pidgin. Есть ли дополнительные шаги, чтобы «разрешить» моему приложению работать с UCWA?

@ShelbyZ Я могу легко авторизовать использование Oauth. Я получаю разрешение на маркер, так что я вошел в

Я получаю JSON, похожий на

"_links":. { "Я": { "HREF": "ссылка"}, "приложения": { "HREF": "Мне это нужно"}, "Xframe": { "HREF": "ссылка"}}}

Сейчас. Мне нужно «зарегистрировать свое приложение», выполняя POST. На этом последнем шаге я получаю ответ на 500 кодов. Я надеюсь, что это не связано с этим @Matthew Проктор сказал .. becouse я не могу просто администрировать сервер

+1

Зная, что содержится в JSON ответ на запрос GET на /Autodiscover/AutodiscoverService.svc/root/oauth/user?originalDomain=domain.com и если домен часть URL соответствие ответа поможет определить, перенаправляется ли вы на другой пул Lync, где этот оригинальный токен OAuth будет недействительным. Исходя из вашей текущей информации, которая является направлением, которое имеет наибольший смысл, но есть недостаток контекста (сетевой трафик, ведущий к точке, где вы видите ответ 500). – ShelbyZ

ответ

0

я получаю ту же ошибку, прежде чем я добавил мой тестовый домен в список разрешенных доменов.

Это может быть обновлена ​​с помощью PowerShell, все подробности ниже:

Enabling UCWA and Configuring Allowed Domains

У меня были клиенты видят подобные ошибки при запуске мой код из http://localhost/, их исправление было проверить свой код на полное доменное имя (т.е. http://testmyucwacode.mydomain.com/).

+0

Использование node.js обойдется без использования xframe, где будет добавлен заголовок X-Ms-Origin.Если этого заголовка нет, проверка не может быть выполнена в отношении списка разрешений для междоменного доступа. – ShelbyZ

2

Спасибо @ShelbyZ Вы были правы, это был сплит-доменный сценарий. Теперь авторизация работает, и я могу зарегистрировать свое приложение. Также примером для будущих поколений

var http = require('request-promise'); 


var lync = {}; 

lync._authorize = function(){ 

    var self = this; 

    var orgDomain = self.urls.user.match(/https:\/\/([\w\d\.]+)/i)[0]; 
    //console.log(orgDomain); 

    http.get(self.urls.user).catch(function(err){ 
     if(err.statusCode == 401){ 
      var toParse = err.response.headers['www-authenticate']; 
      var Oauth = toParse.match(/https:\/\/[\d\w\./_-]+/i)[0]; 

      var loginPost = { 
       grant_type: 'password', 
       username: self.username, 
       password: self.password 
      }; 

      return http.post(Oauth, {form:loginPost}); 
     } 
    }).then(function(data){ 
     if(data) { 
      var parsed = JSON.parse(data); 
      //setup authorization 
      http = http.defaults({ 
       headers: {Authorization: parsed.token_type + ' ' + parsed.access_token} 
      }); 
      return http.get(self.urls.user); 
     } 
    }).then(function(data){ 
     //check for split-domain scenario 
     var parsed = JSON.parse(data); 
     var domain = parsed._links.self.href.match(/https:\/\/([\w\d\.]+)/i)[0]; 
     console.log('[1] '+orgDomain); 
     console.log('[2] '+domain); 

     if(domain!== orgDomain){ 
      //split domain scenario 
      self.urls.user = self.urls.user.replace(orgDomain, domain); 
      http = http.defaults({ 
       headers: {Authorization: null} 
      }); 

      self._authorize(); 
     } else { //create app 
      var parsed = JSON.parse(data); 
      self.urls.applications = parsed._links.applications.href; 

      var registerApp = { 
       culture : "en-us", 
       endpointId : "2d9dc28d-4673-4035-825c-feb64be28e4e", 
       userAgent : "NodeJs client" 
      }; 
      return http.post(self.urls.applications, {body: registerApp, json:true}); 
     } 
    }).then(function(app){ 
     console.log(app); 
    }); 

}; 

lync.setup = function(email, password){ 
    var self = this; 
    var hostname = email.split('@'); 
    this.username = email; 
    this.password = password; 

    //discover urls 
    return http.get('http://lyncdiscover.'+hostname[1]) 
     .then(function(d) { 
      var parsed = JSON.parse(d); 
      self.urls = { 
       self: parsed._links.self.href, 
       user: parsed._links.user.href, 
       xframe: parsed._links.xframe.href 
      }; 
      return self._authorize(); 
     }); 

}; 



//run app 
lync.setup('[email protected]', 'password'); 
Смежные вопросы