2013-03-07 20 views
9

Nie mogę odświeżyć tokenu dostępu Reddit.Nie można odświeżyć tokenu dostępu Reddit OAuth 2.0

kiedy wysłać następującą prośbę do https://ssl.reddit.com/api/v1/access_token

Content-Type: application/x-www-form-urlencoded 
Authorization: ##### 
client_secret=#####&grant_type=refresh_token&client_id=#####&refresh_token=##### 

uzyskać statusu 200 ale zawartość jest {"error": "invalid_request"}.

Zgodnie z OAuth 2.0 spec i Reddit spec robię wszystko dobrze.

Próbowałem również tego bez client_id i client_secret z tym samym wynikiem.

Czy brakuje mi czegoś?

Odpowiedz

20

Implementacja OAuth Reddit jest naprawdę wyjątkowa (i nie w dobrym tego słowa znaczeniu).

niezbędne parametry orzeźwiające żetonów w reddit są:

  1. CLIENT_ID
  2. client_secret
  3. grant_type (= refresh_token)
  4. refresh_token
  5. scope
  6. state
  7. duration
  8. redirect_uri

Będziesz również potrzebować podstawowego nagłówka uwierzytelniania HTTP z CLIENT_ID jako login i client_secret jako hasło.

Musiałem sprawdzić reddit's source code, aby dowiedzieć się, czego brakuje w moich żądaniach ... Tyle czasu na zagubienie w sprawach błahych.

+0

Uważam, że ten błąd został naprawiony i potrzebujesz tylko parametrów grant_type i refresh_token. Zwróci 400, jeśli token odświeżania nie jest dla tej samej aplikacji, co identyfikator_klienta – Nathan

2

W przypadku ktoś szuka bardziej wyraźną odpowiedź:

Oto jak zrobiłem to w PHP.

$authorizeUrl = 'https://ssl.reddit.com/api/v1/access_token'; 
    $clientId = "YOUR_CLIENT_ID"; 
    $clientSecret = "YOUR_CLIENT_SECRET"; 

    $post = array(
     "client_id" => $clientId, 
     "client_secret" => $clientSecret, 
     "grant_type" => "refresh_token", 
     "refresh_token" => "STORED_REFRESH_TOKEN_VALUE", 
     "scope" => "identity", 
     "state" => "WHATEVER_VALUE", 
     "duration" => "temporary",   
     "redirect_uri" => "https://example.com/reddit", 
    ); 

    $payload = http_build_query($post); 

    $ch = curl_init($authorizeUrl); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_USERPWD, $clientId . ":" . $clientSecret); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $result = curl_exec($ch); 
    curl_close($ch);   

    print_r($result);