我无法刷新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 spec和Reddit spec我做的一切都是正确的。
我也在没有client_id
和client_secret
的情况下尝试了相同的结果。
我错过了什么吗?
答案 0 :(得分:20)
Reddit的OAuth实现非常独特(并且不是很好)。
在reddit上刷新令牌的必要参数是:
您还需要基本的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);