2014-09-23 4 views
1

Я хочу: Перевести текст с помощью службы Переводчик BingBing Translate API с JavaScript и Node.js

Проблема: я получаю сообщение:

Веб-Токен должен иметь подпись в конце. Входной токен не имеет подписи в конце токена.

Мой маркер перед кодированием:

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier=Subtitles&http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider=https://datamarket.accesscontrol.windows.net/&Audience=http://api.microsofttranslator.com&ExpiresOn=1411488480&Issuer=https://datamarket.accesscontrol.windows.net/&HMACSHA256=DsdsshfhhegefrgradfsdffqI= 

Код:

var request = require('request'); 
var querystring = require('querystring'); 
/** 
* Demo for translating a 'Hello world' from en to uk with help of Bing Translator service 
*/ 
(function() { 
    var makeTranslateRequest = function(token) { //I provided you my token at this point 
     var opts = { 
      text: 'Hello world', 
      from: 'en-gb', 
      to: 'ru' 
     }; 

     request.get({ 
      url: "http://api.microsofttranslator.com/v2/Http.svc/Translate?contentType=text/plain&from=" + opts.from + "&to=" + opts.to + "&text=" + opts.text, 
      headers: { 
       'Authorization': encodeURIComponent('Bearer' + token).replace(/'/g,"%27").replace(/"/g,"%22") 
      } 
     },function(err,res,body) { 
      var translated = body; 
      console.log('translated: ' + translated); 
     }); 
    } 

    /** 
    * Get token and make translate request in a callback 
    */ 
    var requestOpts = querystring.stringify({ 
     client_id: 'Subtitles', 
     client_secret: 'X...................................s=', 
     scope: 'http://api.microsofttranslator.com', 
     grant_type: 'client_credentials' 
    }); 

    request.post({ 
     encoding: 'utf8', 
     url: "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13", 
     body: requestOpts 
    }, function(err, res, body){ 
     var decoded = decodeURIComponent(body.replace(/\+/g, " ")) 
     var token = JSON.parse(decoded).access_token; 
     makeTranslateRequest(token); 
    }); 
})(); 
+2

Вы уверены, что хотите опубликовать этот ключ HMAC на весь интернет? – AlexMA

+0

Я его анонимный –

ответ

2

Я прочитал кое-что о XML декодирования маркера для here. Поэтому я решил заменить модуль запроса узла на XMLHTTPRequest.

Рабочий пример:

var request = require('request'); 
var querystring = require('querystring'); 
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 

/** 
* Demo for translating a 'Hello world' from en to uk with help of Bing Translator service 
*/ 
(function() { 
    //INSTEAD OF request.get({}) I use XMLHTTPRequest! Also I stoped to decoding/encoding token. That's the solution. 
    var makeTranslateRequest = function(token) { 
     var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.open("GET", "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=en&to=ru&text=Good", true); 
     xmlhttp.setRequestHeader('Authorization', 'Bearer ' + token); 
     xmlhttp.onreadystatechange = function(){ 
      if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
       console.log(xmlhttp.responseText); 
      } 
     } 
     xmlhttp.send(); 
    } 

    /** 
    * Get token and make translate request in a callback 
    */ 
    var requestOpts = querystring.stringify({ 
     client_id: 'Subtitles', 
     client_secret: 'X............................s=', 
     scope: 'http://api.microsofttranslator.com', 
     grant_type: 'client_credentials' 
    }); 

    request.post({ 
     encoding: 'utf8', 
     url: "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13", 
     body: requestOpts 
    }, function(err, res, body) { 
     var token = JSON.parse(body).access_token; 
     makeTranslateRequest(token); 
    }); 
})();