2017-02-04 81 views
9

升級sugar7.8後,我收到了這個錯誤,它調用我的下載文件。升級後sugarcrm文件下載錯誤

{"error":"need_login","error_message":"No valid authentication for user."} 

經過一些調查發現,糖升級了OAuth API調用。以下是我的代碼:

api.fileDownload(api.buildURL("Quotes/" + model.get("id") + "/pdf/download?OAuth-Token=" + api.getOAuthToken()), { 
     success: function() { 
      app.alert.show("pdf_download_api_success", { 
       level: "success", 
       messages: SUGAR.language.get('Quotes', 'LBL_QUOTE_PDF_GENERATED'), 
       autoClose: true 
      }); 
     },}); 

我檢查了以下網址detials:但我能不能叫頭添加到HTTPS請求會有些幫助一個?

https://developer.sugarcrm.com/2016/11/15/security-changes-coming-in-sugar-7-8/

回答

5

經過這麼多的研究,我想出了一個解決這個問題的方法。

注意:api.fileDownload(沒有支持文件使用OAuth-token

所以我嘗試使用XMLHttpRequest,它工作正常。

SOLUTION

var request = new XMLHttpRequest(); 
    request.open('GET', api.buildURL("YOURMODULE/" + model.get("id") + "/pdf/download"), true); 
    request.setRequestHeader('OAuth-Token', api.getOAuthToken()); // UR TOKEN 
    request.responseType = "blob"; 
    request.onload = function (e) { 
     if (this.status === 200) { 
      // `blob` response 
      // create `objectURL` of `this.response` : `.pdf` as `Blob` 
      var file = window.URL.createObjectURL(this.response); 
      var a = document.createElement("a"); 
      a.href = file; 
      /*request.onreadystatechange = function() { 
       if(this.readyState == this.HEADERS_RECEIVED) { 
       console.log(request.getResponseHeader("Content-Type")); 
       } 
      }*/ 

      a.download = request.getResponseHeader("FileName"); 
      document.body.appendChild(a); 
      a.click(); 
      document.body.removeChild(a); 
     }; 
    }; 
    request.send(); 

檢查這個線程可能在將來可能會有更新:https://community.sugarcrm.com/message/90474-re-sugarcrm-filedownload-error-after-upgrade?commentID=90474#comment-90474

0

我從來沒有使用(或聽到),SugarCRM的,但似乎你需要從URL到HTTP標頭將你正在授權令牌。在api.fileDownload()的內置函數調用中,確切地說如何設置一個頭文件很難說(並且不能在線查找描述函數的單個文檔)。但這個想法是從URL中移除令牌,然後最有可能發送標題爲某種參數:

api.fileDownload(api.buildURL("Quotes/" + model.get("id") + "/pdf/download"), { 
http-header: "OAuth-Token = " +api.getOAuthToken(), 
    success: function() { 
     app.alert.show("pdf_download_api_success", { 
      level: "success", 
      messages: SUGAR.language.get('Quotes', 'LBL_QUOTE_PDF_GENERATED'), 
      autoClose: true 
     }); 
    },}); 

另一種方式是簡單地更改設置在您發佈的URL描述:

」如果您想再次啓用此功能,則可以使用名爲allow_oauth_via_get的新SugarConfig設置。當配置設置爲true時,這將允許使用oauth_token URL參數傳遞訪問令牌。「

編輯:所以我相信,我發現在https://github.com/askhogan/sugarcrm/blob/master/index.js

的.js文件在底部OM功能fileDownload():

// ping to make sure we have our token, then make an iframe and download away return this.call('read', this.buildURL('ping'), {}, internalCallbacks, {processData: false});

你有沒有嘗試刪除該令牌部分完全公正希望圖書館能夠在cookies的幫助下處理認證工作?

除此之外,函數似乎沒有設置任何標題字段的選項(只有它看起來讀取的選項似乎並不能幫助你的iframe選項)。

+0

我找了'HTTP-header'只有我試過所有的u提到。 – TomPHP

+0

你提到了我在我的問題中提到的相同內容。 :(@taracus – TomPHP

+0

那麼,我不知道api.fileDownload()調用來自哪裏? 你怎麼知道函數被稱爲fileDownload()而不是downloadFile()例如? 我的猜測是如何爲呼叫設置HTTP頭的文檔可以在相同的地方找到。 爲了記錄我給了它10分鐘的搜索結果,並且找不到任何可搜索的SugarCRM文檔,所以他們的文檔可能在付費牆之後? – taracus