2017-09-12 4 views
2

Je vais avoir un mal fou ... Je suis en train de se coldfusion pour obtenir un jeton de Salesforce, mais je suis coincé sur l'erreur suivantecoldfusion get jeton API de Salesforce - subvention invalide

{"error":"invalid_grant","error_description":"authentication failure"} 

ive essayé cfscript

local.http = new Http(url='https://test.salesforce.com/services/oauth2/token',method='post'); 

     local.http.addParam(type='header',name='content-type', value='application/x-www-form-urlencoded'); 
     local.http.addParam(type='formField',name='grant_type', value='password'); 
     local.http.addParam(type='formField',name='client_id', value='client_id'); 
     local.http.addParam(type='formField',name='client_secret', value='client_password_string'); 
     local.http.addParam(type='formField',name='username', value='[email protected]'); 
     local.http.addParam(type='formField',name='password', value='userspassword'); 
     local.http.addParam(type='formField',name='format',  value='json'); 

     local.httpSendResult = local.http.send(); 
     rc.httpResult = httpSendResult.getPrefix(); 

ive essayé balises cfhttp

<cfhttp url="https://test.salesforce.com/services/oauth2/token" method="POST"> 
     <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded" /> 
     <cfhttpparam type="formField" name="grant_type" value="password" /> 

     <cfhttpparam type="formField" name="client_id" value="client_id" /> 
     <cfhttpparam type="formField" name="client_secret" value="client_password_string" /> 
     <cfhttpparam type="formField" name="username" value="[email protected]" /> 
     <cfhttpparam type="formField" name="password" value="userspassword" /> 

     </cfhttp>  
     <cfset rc.result = cfhttp.fileContent />  

mais le même exécu d'appel exact ted par cURL sur ma machine locale fonctionne parfaitement bien

curl -d "grant_type=password" 
    -d "client_id=client_id" 
    -d "client_secret=client_secret_string" 
    -d "[email protected]" 
    -d "password=userpassword" https://test.salesforce.com/services/oauth2/token 

ive fait en sorte que ma plage d'adresses IP est en liste blanche, ma relaxation IP est de se détendre, allusers peuvent se auto autoriser, ive essayé différents paramètres de nom d'utilisateur et mot de passe, tout ce que je obtenir est la même erreur sur les subventions invalides

toute aide est très appréciée

+0

Est-ce que le code cUrl qui fonctionne fait un post ou un get? –

+0

@DanBracuk je suppose qu'il doit être un poste, je ne pense pas que vous pouvez faire la demande pour le jeton comme un get –

Répondre

1

Je ne suis pas en mesure de commenter, donc je dois répondre :) Mais ce qui est vraiment juste une suggestion. Lorsque vous utilisez <cfhttpparam type="formfield">, l'URL ColdFusion l'encode par défaut pour vous. ColdFusion codera les caractères ~, ., - et _, mais cela ne devrait pas être fait selon la spécification RFC 3986 (voir https://en.wikipedia.org/wiki/Percent-encoding), car ce sont des caractères non réservés. Si vos champs de formulaire contiennent ces caractères (et je suppose qu'ils le font étant donné que votre exemple montre une adresse électronique), il est possible que ces caractères codés incorrectement soient à l'origine de l'échec de l'authentification.

Comme un test rapide, vous pouvez ajouter encoded="false" à vos <cfhttpparam> balises et url encoder leurs valeurs vous utilisant encodeForUrl() ou urlEncodedFormat() (en fonction de votre version de ColdFusion), puis annuler l'encodage incorrect:

<cfhttpparam type="formField" encoded="false" name="username" value="#replacelist(urlEncodedFormat('[email protected]'), '%2D,%2E,%5F,%7E', '-,.,_,~')#"> 
1

Voici un code CFScript extrait d'un CFC que j'ai créé pour accéder à la force de vente. (ne fonctionnera pas comme c'est, mais la logique est là - désolé c'était trop de code pour copier la chose complète). En espérant que cela aidera. J'utilise principalement la même approche que vous, mais vous pourriez vouloir voler certains des paramètres spécifiques (charset, type de contenu, accepter). J'ai truqué les valeurs dans la structure loginCredentials, mais elles sont à peu près du même type de format (à comparer avec les vôtres).

Cela fonctionne bien pour nous sur Railo. Peut-être aussi vérifier qu'il ne s'agit pas d'un problème SSL - avez-vous besoin d'ajouter les certificats SSL dans Coldfusion pour pouvoir communiquer avec Salesforce?

variables.sfAuthDomain = "https://login.salesforce.com"; 

variables.authServiceURL = variables.sfAuthDomain & "/services/oauth2/token"; 

variables.accessToken = "xxxxx" // The access token returned by SF, used on future logins 

variables.loginCredentials = { 
    "grant_type": "password", 
    "client_id": "3MVG9Fkjshdkfjvshd ckjfhjkch.blkjlkjlkjkljl.wkjhgkjhkjhds.mVk84TRzhm_pXxK6_786786", 
    "client_secret": "3887687686868668727", 
    "username": "[email protected]", 
    "password": "Bungerloo!PPkjhj324ij45bQGyymmd" 
}; 


/** 
* MAKE SERVICE CALL 
* Makes HTTP service call 
**/ 
public Struct function makeServiceCall(String serviceUrl, String method="GET", Boolean sfAuth=true, Struct headers={}, Struct formFields) { 

    var httpService = new http(); // create new http service 

    var httpResponse = {}; 

    var fieldName = ""; 

    var bodyData = ""; 

    /* set attributes using implicit setters */ 
    httpService.setMethod(arguments.method); 
    httpService.setCharset("utf-8"); 
    httpService.setUrl(Trim(arguments.serviceURL)); 
    httpService.setTimeOut(variables.timeoutValue); 

    /* add httpparams using addParam() */   
    for(fieldName in arguments.headers) { 
     httpService.addParam(type="header", name="#fieldName#", value="#arguments.headers[fieldName]#");    
    } 

    if(arguments.sfAuth){ 
     httpService.addParam(type="header", name="Authorization", value="OAuth #variables.accessToken#"); 
    } 

    if(StructKeyExists(arguments, "formFields")) { 
     loop collection="#arguments.formFields#" item="fieldName" { 
      bodyData = ListAppend(bodyData, "#fieldName#=#formFields[fieldName]#", "&"); 
     } 
    } 

    if(bodyData is not "") { 
     httpService.addParam(type="body", name="post", encoded="no", value="#bodyData#"); 
    } 

    /* make the http call to the URL using send() */ 
    httpResponse = httpService.send().getPrefix(); 

    //dump(httpResponse, false, "modern", "", 500, "httpResponse"); 

    return httpResponse; 

} 

httpResponse = makeServiceCall(
    serviceUrl = serviceURL, 
    method = "POST", 
    sfAuth = false, 
    headers = { 
     "Content-Type": "application/x-www-form-urlencoded", 
     "accept": "text/json" 
    }, 
    formFields = loginCredentials  
); 
0

Nous avons fini de changer mon serveur coldfusion utiliser TLS 1.2, comme TLS 1.0 a été dépréciée pour une utilisation par Salesforce. Espérons que ma réponse et les réponses utiles données sur ce poste aider quelqu'un d'autre