2013-03-07 29 views
9

Tôi không thể làm mới mã thông báo truy cập Reddit.Không thể làm mới mã thông báo truy cập Reddit OAuth 2.0

Khi tôi gửi sau yêu cầu 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=##### 

tôi nhận được tình trạng 200 nhưng nội dung là {"error": "invalid_request"}.

Theo OAuth 2.0 specReddit spec Tôi làm mọi thứ đúng.

Tôi cũng đã thử nó mà không cần client_idclient_secret với cùng một kết quả.

Tôi có thiếu gì đó không?

Trả lời

20

Triển khai OAuth của Reddit thực sự độc đáo (và không theo cách tốt).

Các thông số cần thiết cho thẻ làm mới trên reddit là:

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

Bạn cũng sẽ cần authentication header HTTP cơ bản với client_id như đăng nhập và client_secret như mật khẩu.

Tôi phải tra cứu số source code của reddit để tìm ra những gì còn thiếu trong yêu cầu của tôi ... Quá nhiều thời gian phát triển bị mất do các vấn đề tầm thường.

+0

Tôi tin rằng lỗi này hiện đã được khắc phục và bạn chỉ cần tham số grant_type và refresh_token. Nó sẽ trả lại 400 nếu mã thông báo làm mới không dành cho cùng một ứng dụng như client_id – Nathan

2

Trong trường hợp bất kỳ ai đang tìm câu trả lời rõ ràng hơn:

Đây là cách tôi đã làm điều này trong 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); 
Các vấn đề liên quan