2016-07-28 12 views
6

Jestem nowicjuszem w SalesForce i pracuję nad tym, aby szybko zacząć pracę z podstawami, ponieważ w przyszłym tygodniu rozpoczniemy duży projekt integracji. Przez przynajmniej część naszej integracji będziemy musieli uzyskać dostęp do interfejsu API SalesForce Rest. W tym celu inny dżentelmen w zespole i ja wykonaliśmy kilka podstawowych prototypów połączeń za pomocą listonosza z dobrym skutkiem, w szczególności wokół uwierzytelniania OAuth2. Naszym problemem jest to, że chociaż wszystko działa dobrze w Postmanie, jak tylko przełączymy się na C#, aby wykonać połączenia, zaczynamy otrzymywać błąd zamiast naszego tokena autoryzacji. Odpowiedź jest HTTP status 400 Bad Request i treść odpowiedzi jestBłąd z uwierzytelnianiem SalesForce od klienta C#

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

Oto przykład niektórych kodu C# staraliśmy:

using System; 
using System.Collections.Generic; 
using System.Net.Http; 
using System.Web; 

namespace SFTokenTest 
{ 
    internal class Program 
    { 
     private const string LoginUrl = "https://test.salesforce.com/services/oauth2/token"; 

     private static void Main(string[] args) 
     { 
      FormUrlEncodedContent content = new FormUrlEncodedContent(new [] 
      { 
      new KeyValuePair<string, string>("grant_type",HttpUtility.UrlEncode("password")), 
      new KeyValuePair<string, string>("password",HttpUtility.UrlEncode("PASSWORD")), 
      new KeyValuePair<string, string>("username", HttpUtility.UrlEncode("USERNAME")), 
      new KeyValuePair<string, string>("client_id",HttpUtility.UrlEncode("CLIENTID")), 
      new KeyValuePair<string, string>("client_secret",HttpUtility.UrlEncode("CLIENTSECRET")) 
      }); 
      HttpResponseMessage response; 
      using (HttpClient client = new HttpClient()) 
      { 
       response = client.PostAsync(LoginUrl, content).Result; 
      } 

      Console.WriteLine(response.Content.ReadAsStringAsync().Result); 
      Console.WriteLine(response.StatusCode); 

      Console.ReadLine(); 
     } 
    } 
} 

Uwaga: to jedna z wielu implementacji, które wypróbowaliśmy, włączając w to HttpWebRequest i WebClient, wszystkie z takim samym wynikiem.

Oprócz naszego własnego kodu próbowaliśmy pobrać kod z repozytorium GitHub developerforce/Force.com-Toolkit-for-NET, który również przedstawił ten sam problem.

Do tej pory mamy dwa dni na rozwiązanie tego problemu bez powodzenia, a my natknęliśmy się na naszego konsultanta SalesForce, dlaczego nie działa. Spróbowaliśmy zresetować token bezpieczeństwa po południu, również bez skutku. Szukałem poprzez szereg artykułów w Internecie (w tym na StackOverflow), którego punkt do następujących kwestii najbardziej:

  • Bad poświadczenia - używamy tych samych poświadczeń powodzeniem w Postman, że staramy się wykorzystywać w naszym C# aplikacje i próbowaliśmy ponownie je kopiować i wklejać z interfejsu użytkownika SalesForce, a my próbowaliśmy ręcznie wpisywać je w nasz kod, na wypadek gdybyśmy wychwycili niewidoczne znaki. (Przez poświadczenia dołączam nazwę użytkownika, hasło, identyfikator klienta i sekret klienta.)
  • Zły lub brakujący nagłówek Content-Type - z pewnością wysyłamy "application/x-www-form-urlencoded", który sprawdziłem w każdej aplikacji kilka razy (i powąchano, aby zweryfikować, czy rzeczywiście został wysłany).
  • Niezakodowane parametry - Widziałem to na wielu wątkach StackOverflow i sprawdziłem, że kodujemy parametry, które wysyłamy, i treść żądania.

Wygląda na to, że jest coś, co Postman robi, że nie jesteśmy w naszych prośbach, ale nie jestem w stanie określić, co to jest. Zdobyliśmy nawet prośby od listonosza i jednego z naszych klientów, a także zmieniliśmy je i wrócili jako identyczni.

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

17

Jeśli jeszcze tego nie rozwiązałeś, myślę, że to może być twój problem. Zgodnie z tym: https://help.salesforce.com/apex/HTViewSolution?id=000221207 Począwszy od czerwca 2016 r. Salesforce będzie wyłączać szyfrowanie TLS 1.0 na całej swojej platformie w podejściu etapowym.

Jeśli masz wersję wcześniejszą niż .net 4.6, oznacza to, że domyślnie nie masz włączonego TLS 1.1/1,2. Tutaj jest mała lista opcji, których możesz użyć, aby ją włączyć: https://help.salesforce.com/apex/HTViewSolution?id=000221207#Inboundintegrations

Dla aplikacji konsolowej takiej jak Twoja, po prostu przetestowano na mojej stronie i następujące, które działały dla mnie (w .net 4.5.2):

 string LoginUrl = "https://login.salesforce.com/services/oauth2/token"; 
     //the line below enables TLS1.1 and TLS1.2 
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 
     FormUrlEncodedContent content = new FormUrlEncodedContent(new[] 
     { 
     new KeyValuePair<string, string>("grant_type", "password"), 
     new KeyValuePair<string, string>("client_id","CLIENTID"), 
     new KeyValuePair<string, string>("client_secret","CLIENTSECRET"), 
     new KeyValuePair<string, string>("password","PASSWORD + SECURITYTOKEN"), 
     new KeyValuePair<string, string>("username", "USERNAME") 
     }); 
     HttpResponseMessage response; 
     using (HttpClient client = new HttpClient()) 
     { 
      response = client.PostAsync(LoginUrl, content).Result; 
     } 
     Console.WriteLine(response.Content.ReadAsStringAsync().Result); 
     Console.WriteLine(response.StatusCode); 
     Console.ReadLine(); 
+0

Zidentyfikowaliśmy to jako nasz problem i mogę zweryfikować, że wprowadziliśmy dokładnie tę samą zmianę, a nasz kod również działa. – ChaosMonkey

+0

Dziękuję bardzo - od wczoraj zmagam się z tym samym problemem. Dodano pojedynczą linię ServicePointManager i zadziałało. Myślałem, że oszaleję! – cyberspy

+0

Dziękuję bardzo za pomoc. To działa dla mnie – gaurav

Powiązane problemy