2012-06-05 12 views
7

Estoy tratando de obtener un token de autorización utilizando el flujo de Nombre de usuario-Contraseña (como se describe en la sección final del artículo this).¿Cómo puedo usar grant_type = contraseña oauth flow con salesforce.com?

estoy enviando la petición siguiente (utilizando httplib de Python, en caso de que sea relevante):

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> 

Y conseguir la respuesta:

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

es la grant_type contraseña realmente no compatible, o soy Me falta algo? Parece dar este error incluso cuando estoy enviando un grant_type que definitivamente funciona (como authorization_code).

Tenga en cuenta que he intentado con las sugerencias en la respuesta here, y no funcionan para mí.

+0

puede publicar su código y/o una captura de la petición http real . – superfell

Respuesta

19

Normalmente, esto se debe a que el encabezado content-type no se ha establecido en el valor correcto, debe ser application/x-www-form-urlencoded.

También asegúrese de que sus parámetros estén codificados correctamente (especialmente si está compilando la carga de POST a mano).

+0

Gracias por la respuesta rápida. No pude encontrar ninguna mención de ese requisito en el artículo que estaba siguiendo ... – Symmetric

6

A continuación se muestra la función detallada/lógica sobre cómo utilizar grant_type = flujo oauth contraseña con salesforce.com en 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, lo intenté mientras escribía el fragmento de código anterior, todavía estoy por debajo del problema Respuesta de inicio de sesión: { "error": "invalid_grant" ", " error_description ":" error de autenticación " } He utilizado la credencial correcta, aunque la recibí, hágamelo saber si puede orientar sobre esto. – Ashish

0

debe establecer el grant_type como "contraseña" en los datos del formulario. Vea abajo.

Los datos del formulario se debe pasar ad grant_type = contraseña & nombre de usuario = nilavghosh% 40gmail.com & password = ******