2017-02-04 1 views
9

J'ai reçu cette erreur après que j'ai mis à jour sugar7.8, Qui appelle mon filedownload. Après qu'une enquête ait révélé que le sucre avait été mis à niveau, l'API appelle OAuth. Voici mon code:fichier sugarcrmTélécharger l'erreur après la mise à niveau

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 
      }); 
     },}); 

J'ai vérifié les detials dans l'url suivante: Mais je ne pouvais pas en mesure d'ajouter headder à la demande HTTPS peut quelqu'un d'aide?

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

Répondre

5

Après tant de recherches, j'ai trouvé une solution à ce problème.

Remarque: Il n'existe aucun document de support pour api.fileDownload( pour utiliser OAuth-token.

J'ai donc essayé d'utiliser XMLHttpRequest et cela a bien fonctionné.

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(); 

Vérifiez ce fil peut être à l'avenir il peut y avoir des mises à jour: https://community.sugarcrm.com/message/90474-re-sugarcrm-filedownload-error-after-upgrade?commentID=90474#comment-90474

0

Je ne l'ai jamais utilisé (ou entendu parler) SugarCRM mais il semble que vous devez déplacer votre jeton authing de l'URL pour l'en-tête HTTP. Exactement comment définir un en-tête dans l'appel de fonction intégré à api.fileDownload() est difficile à dire (et ne peut pas trouver un seul document en ligne décrivant la fonction). Mais l'idée est de supprimer le jeton de l'URL, puis très probablement envoyer l'en-tête comme une sorte de paramètre:

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 
     }); 
    },}); 

Une autre façon serait de changer simplement les paramètres comme décrit dans l'URL que vous avez affichée:

"Si vous souhaitez réactiver cette fonctionnalité, vous pouvez utiliser un nouveau paramètre SugarConfig appelé allow_oauth_via_get Lorsque le paramètre config est défini sur true, le paramètre oauth_token URL sera utilisé pour transmettre les jetons d'accès."

EDIT: Je crois que je trouve le fichier .js à https://github.com/askhogan/sugarcrm/blob/master/index.js

Au fond om la fileDownload() Fonction:

// 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});

Avez-vous essayé d'enlever la partie jeton complètement et juste espérons que la bibliothèque va gérer l'authentification à l'aide de cookies? En dehors de cela, la fonction ne semble pas avoir une option pour définir des champs d'en-tête (seule option qu'il semble lire est l'option iframe qui ne semble pas vous aider).

+0

Je cherche la 'http-header' que j'ai essayé tout u ont mentionné. – TomPHP

+0

Vous avez mentionné la même chose que j'ai mentionné dans ma question. :(@taracus – TomPHP

+0

Eh bien, je ne sais pas d'où vient l'appel api.fileDownload() Comment saviez-vous que la fonction s'appelle fileDownload() et non downloadFile() par exemple? Je suppose que la documentation sur la façon de définir l'en-tête HTTP pour l'appel peut être trouvée au même endroit. Pour l'enregistrement, je lui ai donné 10 minutes de googling et je n'ai trouvé aucune documentation consultable pour SugarCRM alors peut-être que leurs documents sont derrière un paywall ou quelque chose comme ça? – taracus