2014-04-20 10 views
5

używam poniższy kod aby otrzymać okaziciela Token:Twitter 1,1 OAuth authenticity_token_error (99)

$token = base64_encode($client_id.':'.$client_sec); 

$data = array ('grant_type' => 'client_credentials'); 
$data = http_build_query($data); 

$header = array(
    'Authorization: Basic '.$token, 
    'Content-type: application/x-www-form-urlencoded;charset=UTF-8', 
    'Content-Length: ' . strlen($data) 
); 

$options = array(
    CURLOPT_HTTPHEADER => $header, 
    CURLOPT_HEADER => false, 
    CURLOPT_URL => 'https://api.twitter.com/oauth2/token', 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_POSTFIELDS => $data 
); 

$ch = curl_init(); 
curl_setopt_array($ch, $options); 
$result = curl_exec($ch); 
curl_close($ch); 
print_r($result); 
exit; 

Ale wyjściowy cały czas:

{"errors":[{"label":"authenticity_token_error","code":99,"message":"Unable to verify your credentials"}]}

Co robię źle?

+1

Cóż, najprawdopodobniej poświadczenia są nieprawidłowe i dlatego nie można ich uwierzytelnić? – hakre

+0

Tak, dziękuję. –

Odpowiedz

12

Po walce z tym problemem przez chwilę stwierdziłem, że problem polegał na tym, że dzwoniłem do/oauth2/tokena za pomocą klienta Advanced Rest z przeglądarki, z której byłem już zalogowany na Twitterze. Po wylogowaniu się z Twittera i ponownym wywołaniu API zadziałało.

Krótka odpowiedź: upewnij się, że nie masz aktywnej sesji zalogowanej na Twitterze, gdy próbujesz zażądać tokena na okaziciela.

+0

Uratujesz mi życie. – xiidarkevil

4

Walczyłem z tym przez chwilę i żadna z odpowiedzi, które znalazłem, nie pomogła. Dokumentacja dotycząca błędu jest również niejasna "coś poszło nie tak".

Moim problemem jest to, że używałem mashup kodu znalazłem, a nagłówki nie były stosowane prawidłowo:

$headers = array(
    'Authorization' => 'Basic ' . base64_encode($appid . ':' . $secret), // WRONG!!! 

    'Authorization: Basic ' . base64_encode($appid . ':' . $secret),  // Correct! 
    'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',  // Correct! 
); 

Dla mnie problemem było to, że nagłówek Authorization został w formacie klucz-wartość , podczas gdy nagłówek typu zawartości nie był. Połamało to nagłówek autoryzacji.

Oto kilka innych rzeczy do wyboru, które również odnoszą się do błędu 99:

  1. Sprawdź, czy dane są prawidłowe i base64 zakodowany (patrz wyżej)
  2. Upewnij się, że prośba jest za pomocą POST
  3. Upewnij się, że typ zawartości jest ustawiony (patrz wyżej).
  4. Upewnij się, że wpisano grant_type = client_credentials jako pole wiadomości.
  5. SSL jest wymagany, upewnij się, że jest używany (https: //)
  6. Wypróbuj verbose logging, aby pomóc w debugowaniu. Powinien zawierać informacje o certyfikacie SSL, nagłówek autoryzacji i nagłówek typu treści. To nie będzie wyświetlać pola grant_type, ale tylko nagłówki.
  7. Jeśli wszystko wygląda dobrze, ale nadal nie będzie działać, możesz uzyskać ograniczoną stawkę. Limity prędkości resetują się co 15 minut.

Po otrzymaniu tokena dostępu upewnij się, że go buforujesz, aby uniknąć ograniczenia stawki. Otrzymuję 450 żądań co 15 minut, jak sądzę. Połowa z tego zostanie wydana na uzyskanie tokena dostępu, jeśli go nie buforujesz!

+1

Osobiście brakowało mi "Basic" przed zakodowanym kluczem i sekretem –

0

Po walce z tym problemem, w końcu wymyślę rozwiązanie. Twitter w rzeczywistości nie wysyła prawidłowej wiadomości, jeśli błąd istnieje gdziekolwiek.

Kiedy wysyłam żądanie z loków, działa dobrze, ale po przejściu przez kod. Miałem ten sam błąd {"errors":[{"label":"authenticity_token_error","code":99,"message":"Unable to verify your credentials"}]}

Więc co mam, problem leżał z nagłówkiem kontroli dostępu.Ustawienie tych nagłówek nie działa dla mnie

 xhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded") 
    xhttp.setRequestHeader('Access-Control-Allow-Headers', '*'); 
    xhttp.setRequestHeader('Access-Control-Allow-Origin', '*') 
    xhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest') 

jako obejście i po prostu użył tego adresu URL żądanie obejścia do handler Cors

https://cors-anywhere.herokuapp.com/https://api.twitter.com/oauth2/token 

dodanej „https://cors-anywhere.herokuapp.com/” przed rzeczywistym URL i zaczął działać. Mam nadzieję, że ktoś może napotkać ten problem w problemie