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.
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
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
Dziękuję bardzo za pomoc. To działa dla mnie – gaurav