无法刷新Reddit OAuth 2.0访问令牌

时间:2013-03-07 21:55:24

标签: oauth-2.0 reddit

我无法刷新Reddit访问令牌。

当我向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=#####

我的状态为200,但内容为{"error": "invalid_request"}

根据OAuth 2.0 specReddit spec我做的一切都是正确的。

我也在没有client_idclient_secret的情况下尝试了相同的结果。

我错过了什么吗?

2 个答案:

答案 0 :(得分:20)

Reddit的OAuth实现非常独特(并且不是很好)。

在reddit上刷新令牌的必要参数是:

  1. 的client_id
  2. client_secret
  3. grant_type(= refresh_token)
  4. refresh_token
  5. scope
  6. state
  7. duration
  8. REDIRECT_URI
  9. 您还需要基本的HTTP身份验证标头, client_id 作为登录名, client_secret 作为密码。

    我不得不查看reddit的source code以找出我的请求中缺少的内容......在琐碎的事情上花费了大量的开发时间。

答案 1 :(得分:2)

如果有人想要更明确的答案:

以下是我在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);