2012-06-05 6 views
7

Próbuję uzyskać token autoryzacji za pomocą przepływu Nazwa użytkownika-Hasło (zgodnie z opisem w końcowej sekcji artykułu this).Jak mogę użyć przepływu grant_type = hasło oauth z salesforce.com?

Wysyłam następującą prośbę (za pomocą httplib Pythona w przypadku, który jest istotne):

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> 

i uzyskiwanie odpowiedzi:

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

Czy grant_type hasło naprawdę nieobsługiwane lub am Brakuje mi czegoś? Wydaje się, że daje ten błąd nawet wtedy, gdy wysyłam element grant_type, który zdecydowanie działa (na przykład kod autoryzacji).

Należy zauważyć, że próbowałem sugestie w odpowiedzi here, a one nie działają dla mnie.

+0

można pisać kod i/lub wychwytywanie rzeczywistej żądanie http . – superfell

Odpowiedz

19

Zazwyczaj jest tak, ponieważ nagłówek typu treści nie został ustawiony na prawidłową wartość, powinien to być application/x-www-form-urlencoded.

Upewnij się także, że parametry są poprawnie zakodowane (szczególnie, jeśli budujesz ładunek POST ręcznie).

+0

Dzięki za szybką odpowiedź. Nie mogłem znaleźć żadnej wzmianki o tym wymaganiu w artykule, który śledziłem ... – Symmetric

6

Poniżej szczegółowy funkcja/logika jak używać grant_type = hasło przepływ OAuth z Salesforce.com w 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, próbowałem, jak napisałeś fragment kodu powyżej, Nadal dostaję poniżej problem Odpowiedź logowania: { "błąd": "invalid_grant ", " error_description ":" authentication failure " } Użyłem odpowiednich poświadczeń, mimo że dostałem, proszę dać mi znać, jeśli potrafisz to poprowadzić. – Ashish

0

Musisz ustawić grant_type jako „hasło” w danych formularza. Zobacz poniżej.

danych formularza powinny być przekazywane reklam grant_type = hasło & username = nilavghosh% 40gmail.com & hasło = ******

Powiązane problemy