Uwierzytelnij użytkownika testowego {„error_type”: „OAuthException”, „code”: 400, „error_message”: „Nieprawidłowa aplikacja platformy”}

17

Próbuję odzyskać token dostępu za pomocą interfejsu API Instagram Basic Display, ale podczas próby uwierzytelnienia użytkownika testowego pojawia się ten błąd:

{
    "error_type": "OAuthException",
    "code": 400,
    "error_message": "Invalid platform app"
}

Spodziewam się zobaczyć ekran autoryzacji aplikacji

Felice Caricati
źródło
Czy kiedykolwiek wymyśliłeś rozwiązanie tego problemu? Mam ten sam problem.
MontyTheMack

Odpowiedzi:

26

Felice!

Podczas konfigurowania aplikacji na Instagram powinieneś używać identyfikatora aplikacji specyficznego dla platformy, a nie ogólnej konfiguracji na Facebooku.

W aplikacji Facebook Dashboard przejdź do identyfikatora aplikacjiProducts > Instagram > Basic Display na Instagramie .

Użyj tego w adresie URL autoryzacji i powinno działać.

Filipe V
źródło
Czy kiedykolwiek wymyśliłeś rozwiązanie tego problemu? Mam ten sam problem.
MontyTheMack
4
Używam identyfikatora aplikacji na Instagramie i nadal wyświetla ten błąd.
MontyTheMack
1
To samo tutaj. Zauważyłem, że niezależnie od parametrów, które umieścisz na [ api.instagram.com/oauth/access_token/] , wygeneruje błąd! Może zły punkt końcowy? W każdym razie postępowałem zgodnie ze wszystkim krok po kroku wymienionym na [ developers.facebook.com/docs/instagram-basic-display-api/... i wszystko działało doskonale do momentu kroku 5: Wymień kod na token, którego następnie używam listonosz, aby zadzwonić [ api.instagram.com/oauth/access_token/] z parametrami client_id, client_secret, grant_type, redirect_uri i kod (odzyskane po pomyślnej autoryzacji) . ale zawodzi
DingDong,
6
Miałem ten sam problem, który zrobiłem testowi z listonoszem, przekazując parametry przez ciało i ustawiając x-www-form-urlencoded, działało jak cham
Michael de Menten
6

Przekazywanie parametrów przez ciało oraz w x-www-form-urlencoded działa dobrze, jak widać na poniższym obrazku wprowadź opis zdjęcia tutaj

Michael de Menten
źródło
1
prawda, działało to doskonale
DingDong
To nie działa dla mnie
Nikunj
1
dzięki, naprawdę mi pomogłeś :)
BartK_97
2

Miałem podobny problem i byłem w stanie go rozwiązać, ustawiając typ treści żądania na application / x-www-form-urlencoded. poniżej znajduje się przykład ac # pokazujący sposób wykonania żądania:

public async Task<UserTokenResponseModel> GetUserToken(string code)
    {
        var url =
            $"https://api.instagram.com/oauth/access_token";

        var request = new HttpRequestMessage(HttpMethod.Post, url);

        var client = _httpClientFactory.CreateClient();

        var requestContent = new List<KeyValuePair<string, string>>();
        requestContent.Add(new KeyValuePair<string, string>("client_id", ClientId));
        requestContent.Add(new KeyValuePair<string, string>("client_secret", Secret));
        requestContent.Add(new KeyValuePair<string, string>("grant_type", "authorization_code"));
        requestContent.Add(new KeyValuePair<string, string>("code", code));
        requestContent.Add(new KeyValuePair<string, string>("redirect_uri", "https://localhost:44315/instagram/authorizecallback"));

        request.Content = new FormUrlEncodedContent(requestContent);

        var response = await client.SendAsync(request);
        var content = await response.Content.ReadAsStringAsync();

        if (!response.IsSuccessStatusCode)
        {
            throw new Exception(content);
        }

        return JsonConvert.DeserializeObject<UserTokenResponseModel>(content);
    }
William Rees
źródło
1

Jak wspomniano również w innej odpowiedzi, problem dotyczył treści formularza, która ma zostać wysłana w formacie x-www-form-urlencoded . Dla listonosza działało to dobrze, ale implementacja tego samego pod kątem jest nieco typowa. Tutaj treść żądania żądania najpierw musi zostać przekonwertowana w formacie HttpParams, a następnie przekazana do parametru „body” żądania żądania jako ciąg znaków taki jak ten.

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class appService {

  constructor(private http: HttpClient) { }

  public getInstaAccessToken(formData) {
    let full_url = "https://api.instagram.com/oauth/access_token";
    let body = new HttpParams()
      .set("client_id" , "YOUR_CLIENT_ID")
      .set("client_secret","YOUR_CLIENT_SECRET")
      .set("code","code received from redirect url")
      .set("grant_type","authorization_code")
      .set("redirect_uri","your redirect uri")
    const requestOptions = {
      headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded')
    }
    return this.http.post(full_url, body.toString(), requestOptions).subscribe(data=>{
      console.log(data);
      /* 
        {
          "access_token": "IGQVJ...",
          "user_id": 17841405793187218
        }
      */
    })
  }

}
himanshu goyal
źródło