sugarcrm file升级后下载错误

时间:2017-02-04 11:50:03

标签: php oauth-2.0 sugarcrm

我升级了Sugar7.8之后收到了这个错误,它调用了我的文件下载。

{"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请求中添加headder可以帮助一些吗?

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

2 个答案:

答案 0 :(得分:5)

经过大量研究,我想出了解决这个问题的方法。

注意:api.fileDownload(没有支持文档可以使用OAuth-token

所以我尝试使用XMLHttpRequest并且效果很好。

<强>解

    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

答案 1 :(得分:0)

我从未使用(或听说过)SugarCRM,但似乎您需要将您的authing令牌从url移动到HTTP-header。究竟如何在内置函数调用api.fileDownload()中设置标头很难说(并且无法在线找到描述该函数的单个文档)。但我们的想法是从网址中删除令牌,然后很可能将标头作为某种参数发送:

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中描述的设置:

&#34;如果您想再次启用此功能,则可以使用名为allow_oauth_via_get的新SugarConfig设置。当配置设置为true时,这将允许使用oauth_token URL参数来传递访问令牌。&#34;

编辑:所以我相信我在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});

您是否尝试过完全删除令牌部分,并希望图书馆能够在Cookie的帮助下处理身份验证?

除此之外,该函数似乎没有设置任何标题字段的选项(它似乎只读取的选项是iframe选项,它似乎对您没有帮助)。