Kod odpowiedzi 403 w API otomoto.pl

0

WItam , moze mi ktos pomoze , serwer otomoto zwraca mi kod błędu 403 .Podsylam kod skromnego programu

using (WebClient client = new WebClient())
{
    var querystring = new System.Collections.Specialized.NameValueCollection();
    querystring.Add("client_id:", "****");
    querystring.Add("client_secret", "******");
    querystring.Add("grant_type", "password");
    querystring.Add("username", "*****");
    querystring.Add("password", "*****");
    byte[] responsebytes = client.UploadValues("https://www.otomoto.pl/api/open/oauth/token", "POST", querystring);

    string result = System.Text.Encoding.UTF8.GetString(responsebytes);

}
1

@ka0606: Jak patrzę na to API to widzę, że w requescie dla password te dane to nie query-string. Może to jest problem?

0
Dregorio napisał(a):

@ka0606: Jak patrzę na to API to widzę, że w requescie dla password te dane to nie query-string. Może to jest problem?

Mozesz podrzucic drobna modyfikacje kodu ? bede wdzieczny

5

Zacząłbym od zwykłego curl'a z przykładu:

curl -X POST
    -u client_id:client_secret 
    -d "grant_type=password"
    -d "[email protected]"
    -d "password=gimmeaccess"
    http://{example.com}/api/open/oauth/token

Zauważ że -u client_id:client_secret
Czyli to user i password mają być w nagłówku.

Podejrzewam że w ten sposób:
https://stackoverflow.com/questions/25852551/how-to-add-basic-authentication-header-to-webrequest

0

403 to błąd klienta więc coś zrobiłeś nie tak.

0
//załóżmy że parametry dostępowe są w słowniku 
/*{ "client_id", ClientId },
  { "grant_type", "password" },
  { "username", Username },
  { "client_secret", ClientSecret },
  { "password", Password }*/

//przekazujesz to do metody który "robi" nagłówki x-www-form-urlencoded
          
            var xFormsData = string.Join("&", data.Select(kvp => $"{kvp.Key}={kvp.Value}"));

            var request = new HttpRequestMessage(HttpMethod.Post, address)
            {
                Content = new StringContent(xFormsData, Encoding.UTF8, "application/x-www-form-urlencoded")
            };

            var response = _httpClient.SendAsync(request);
0
ka0606 napisał(a):

WItam , moze mi ktos pomoze , serwer otomoto zwraca mi blad 403 .Podsylam kod skromnego programu

            using (WebClient client = new WebClient())
            {
                var querystring = new System.Collections.Specialized.NameValueCollection();
                querystring.Add("client_id:", "****");
                querystring.Add("client_secret", "******");
                querystring.Add("grant_type", "password");
                querystring.Add("username", "*****");
                querystring.Add("password", "*****");
                byte[] responsebytes = client.UploadValues("https://www.otomoto.pl/api/open/oauth/token", "POST", querystring);

                string result = System.Text.Encoding.UTF8.GetString(responsebytes);

            }

dodaj nagłówek:
User-Agent

Przykładowe wywołanie u mnie:

client = new RestClient(this.otomotoConfig.ApiUrl);
client.AddDefaultHeader("User-Agent", this.otomotoConfig.UserEmail);
var request = new RestRequest("oauth/token", Method.Post);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("grant_type", this.otomotoConfig.GrantType);
request.AddParameter("username", this.otomotoConfig.UserName);
request.AddParameter("password", this.otomotoConfig.Password);

var resp = await Post<OtomotoResponse>(request);
private async Task<T?> Post<T>(RestRequest request)
{
    if (!(accessToken).Equals(string.Empty))
        client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(accessToken, "Bearer");
    else
        client.Authenticator = new HttpBasicAuthenticator(this.otomotoConfig.ApiUserName, this.otomotoConfig.ApiKey);

    var result = await client.ExecuteAsync<T>(request);

    var content = result.Content;

    var res = JsonConvert.DeserializeObject<T>(content!);

    return res;
}

(ja u siebie uzywam RestSharpa, więc sprawdź jak to zrobić w WebCliencie).

1

Temat do zamknięcia, sprawa rozwiązana. Kod Programu - może komuś się przyda

 string login = "";
            string password = "";
            string url = "https://www.otomoto.pl/api/open/";
            string client_id = "";
            string client_secret = "";
            var restclient = new RestClient(url);
            RestRequest request = new RestRequest("oauth/token") { Method = Method.Post };
            request.AddHeader("Accept", "application/json");
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddParameter("client_id", client_id);
            request.AddParameter("client_secret", client_secret);
            request.AddParameter("grant_type", "password");
            request.AddParameter("username", login);
            request.AddParameter("password", password);
            var tResponse = restclient.Execute(request);
            var responseJson = tResponse.Content;
            var token = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseJson)["access_token"].ToString();

1 użytkowników online, w tym zalogowanych: 0, gości: 1