2016-08-05 7 views
0

Я успешно разрешил приложение для Google Apps Script с помощью API Xero и могу получить пробные балансы. Однако, как только я добавляю строку запроса (? Date = YYYY-mm-dd) к запросу, я получаю 401 - не авторизован.Xero API Auth не использует строку запроса с помощью скрипта Google Apps

Добавление строки запроса так же, как я успешно использовал пейджинг для получения платежей и счетов-фактур.

Может кто-нибудь увидеть проблему:

(The Gist)

function getTrialBalancesWithNoDate() { 

    // . 
    // . 
    // . 

    fetchPublicAppData('Reports/TrialBalance', '', '') // OK 

    // . 
    // . 
    // . 
} 

function getTrialBalancesWithDate() { 

    // . 
    // . 
    // . 

    fetchPublicAppData('Reports/TrialBalance', '2016-07-01', 'date') // Error - Not authorised 

    // . 
    // . 
    // . 
} 

function getInvoices() { 

    // . 
    // . 
    // . 

    fetchPublicAppData('Invoices', pageNumber, 'page') // OK 

    // . 
    // . 
    // . 
} 

function fetchPublicAppData(item, parameter, query) { 

    /* For PUBLIC APPLICATION TYPE */ 

    if (typeof query !== 'undefined' && query !== '') { 
    query = query + '=' + parameter 
    } else { 
    query = '' 
    } 

    this.loadSettings(); // get latest settings 

    var requestURL = API_END_POINT + '/' + item ;  
    var oauth_signature_method = 'HMAC-SHA1'; 
    var oauth_timestamp = (new Date().getTime()/1000).toFixed(); 
    var oauth_nonce = Utils_.generateRandomString(Math.floor(Math.random() * 50)); 
    var oauth_version = '1.0'; 

    var signBase = 
     'GET' + '&' + 
     encodeURIComponent(requestURL) + '&' + 
      encodeURIComponent(
      'oauth_consumer_key=' + this.consumerKey + '&' + 
      'oauth_nonce=' + oauth_nonce + '&' + 
      'oauth_signature_method=' + oauth_signature_method + '&' + 
      'oauth_timestamp=' + oauth_timestamp + '&' + 
      'oauth_token=' + this.accessToken + '&' +        
      'oauth_version=' + oauth_version + (query === '' ? '' : '&') +    
      query); 

    var sbSigned = Utilities 
     .computeHmacSignature(
      Utilities.MacAlgorithm.HMAC_SHA_1, 
      signBase, 
      encodeURIComponent(this.consumerSecret) + '&' + encodeURIComponent(this.accessTokenSecret)); 

    var oauth_signature = Utilities.base64Encode(sbSigned); 

    var authHeader = 
     "OAuth oauth_consumer_key=\"" + this.consumerKey + 
     "\",oauth_nonce=\"" + oauth_nonce + 
     "\",oauth_token=\"" + this.accessToken + 
     "\",oauth_signature_method=\"" + oauth_signature_method + 
     "\",oauth_timestamp=\"" + oauth_timestamp + 
     "\",oauth_version=\"1.0\",oauth_signature=\"" + 
     encodeURIComponent(oauth_signature) + "\""; 

    var headers = {"User-Agent": + this.userAgent, "Authorization": authHeader, "Accept": "application/json"}; 
    var options = {"headers": headers, "muteHttpExceptions": false}; 

    requestURL = requestURL + (query === '' ? '' : '?') + query 
    var response = UrlFetchApp.fetch(requestURL, options); 
    var responseCode = response.getResponseCode(); 
    var responseText = response.getContentText(); 

    if (responseCode === 200) { 

    return JSON.parse(responseText); 

    } else if (responseCode === 401) { 

    PropertiesService.getScriptProperties().setProperty('isConnected', 'false') 
    onOpen() // Reset menu 
    throw new Error('The Auth token has expired, run Xero > Settings (connect)'); 

    } else { 

    throw new Error(responseText); 
    } 

} // fetchPublicAppData()enter code here 

ответ

1

Ваш вопрос будет на данном этапе https://gist.github.com/andrewroberts/fed16cc1c7fed9c6d805ffd077efe8c7#file-trialbalance-gs-L58-L68.

При построении вашего SignatgureBaseString для oauth 1.0a порядок параметров имеет значение. Они должны быть заказаны в лексикографическом порядке.

A, B ... Y, Z, a, b ... y, z 

Короче говоря, это означает, что параметры необходимо заказывать в алфавитном порядке, сначала в верхнем регистре, а затем в нижнем регистре.

В вашем примере с PARAM запроса

?date=YYYY-mm-dd 

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

date=... < oauth_consumer_key=... 

Причина была правильно работает для параметра подкачки просто удобно, «страница = ...» будет последний параметр должен быть добавлен после их сортировки.

Стоит также отметить, что если ваша запрос пары строки была

?page=1&date=YYYY-mm-dd 

вам нужно будет разделить вашу запрос пары строки в два Params и сортировки/добавить их accoridingly

date=YYYY-mm-dd&oauth_consumer_key=blah&...&oauth_version=1.0&page=1 
+0

Wow! Благодарю. Не думай, что я когда-нибудь это проработал. –