2012-06-05 5 views
7

Sto cercando di ottenere un token di autorizzazione utilizzando il flusso Username-Password (come descritto nella sezione finale dell'articolo this).Come posso utilizzare il grant_type = password oauth flow con salesforce.com?

sto inviando la seguente richiesta (usando httplib di Python, nel caso in cui è rilevante):

https://login.salesforce.com/services/oauth2/token 

POST data: 

username=<un>&client_secret=<consumer_secret>&password=<pw+token>&grant_type=password&client_id=<consumer_key> 

E ottenere la risposta:

400 Bad Request 
{"error":"unsupported_grant_type","error_description":"grant type not supported"} 

è il grant_type password veramente non supportato, o sono Mi manca qualcosa? Sembra dare questo errore anche quando sto inviando un grant_type che sicuramente funziona (come codice_autorizzazione).

Nota che ho provato i suggerimenti nella risposta here e non funzionano per me.

+0

puoi pubblicare il tuo codice e/o di una cattura della richiesta HTTP reale . – superfell

risposta

19

Questo perché l'intestazione del tipo di contenuto non è stata impostata sul valore corretto, dovrebbe essere application/x-www-form-urlencoded.

Verificare inoltre che i parametri siano codificati correttamente (soprattutto se si sta costruendo il payload POST a mano).

+0

Grazie per la rapida risposta. Non sono riuscito a trovare alcuna menzione di tale requisito nell'articolo che stavo seguendo ... – Symmetric

6

Di seguito è dettagliata la funzione/logica su come utilizzare grant_type = flusso OAuth la password con salesforce.com in JAVA:

// Authenticate via OAuth 
    JSONObject response = oauthLogin(); 
    System.out.println("Login response: " + response.toString(2)); 
    if (!response.has("access_token")) { 
     throw new Exception("OAuth failed: " + response.toString()); 
    } 

    .......................... 


    private static JSONObject oauthLogin() throws Exception { 

    org.eclipse.jetty.client.HttpClient jettyHttpClient = new org.eclipse.jetty.client.HttpClient(); 
    jettyHttpClient.start(); 

    String url = LOGIN_SERVER + "/services/oauth2/token"; 

    ContentExchange exchange = new ContentExchange(); 
    exchange.setMethod("POST"); 
    exchange.setURL(url); 

    String message = "grant_type=password&client_id=" + CLIENT_ID 
      + "&client_secret=" + CLIENT_SECRET + "&username=" + USERNAME 
      + "&password=" + PASSWORD; 

    exchange.setRequestHeader("Content-Type", 
      "application/x-www-form-urlencoded"); 
    exchange.setRequestContentSource(new ByteArrayInputStream(message 
      .getBytes("UTF-8"))); 

    jettyHttpClient.send(exchange); 
    exchange.waitForDone(); 

    return new JSONObject(new JSONTokener(exchange.getResponseContent())); 
} 
+0

HI Chirag, ho provato mentre hai scritto lo snippet di codice sopra, Sto ancora ricevendo il seguente problema. Risposta di login: { "error": "invalid_grant ", " error_description ":" autenticazione fallita " } Ho usato le credenziali corrette, anche se ho ottenuto, per favore fatemi sapere, se potete guidare su questo. – Ashish

0

È necessario impostare la grant_type come "password" nei dati del modulo. Vedi sotto.

I dati del modulo dovrebbe essere passato ad grant_type = Password & username = nilavghosh% 40gmail.com & password = ******