在OAuth 2.0中交换访问令牌的授权码

时间:2018-04-20 02:44:54

标签: php oauth-2.0 oauth2client

我正在尝试使用oAuth 2.0交换授权代码(位于此页面的URL中)以获取访问令牌。

我正在运行以下php代码并收到错误(http错误500)。

我无法弄清楚以下代码有什么问题。我删除了实际的客户端ID,等等 - 它在那里显示代码:

<?php
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://id.shoeboxed.com/oauth/token",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"grant_type\":\"authorization_code\",\"client_id\": \"f8de67be8dc84e449203fcdd4XXXXXXX\",\"client_secret\": \"HS5ZeIVsKW0/qqiO9/XcdeWqnF8vtzQrpY8gcdrxg0BXNZXXXXXXX\",\"code\": \"['code']\",\"redirect_uri\": \"http://website.com/foursquare2.php"}",
  CURLOPT_HTTPHEADER => array(
    "content-type: application/json"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
?>

1 个答案:

答案 0 :(得分:1)

帖子字段中的json字符串不是有效的json字符串。你可以在这里测试json:

https://jsonlint.com/

您可以尝试使用帖子字段填充数组,然后使用json_encode()将数组编码为curl请求中的json sting。这有助于在创建json字符串时缓解错误。我非常喜欢这样做。

$postArray = array(

      'grant_type' => 'authorization_code',
      'client_id' => 'f8de67be8dc84e449203fcdd4XXXXXXX',
      'client_secret' => 'HS5ZeIVsKW0/qqiO9/XcdeWqnF8vtzQrpY8gcdrxg0BXNZXXXXXXX',
      'code' => '[\'code\']',
      'redirect_uri' => 'http://website.com/foursquare2.php'

);


$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://id.shoeboxed.com/oauth/token",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_SSL_VERIFYPEER => false, //<--- Added this.
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",  //<---You may also try "CURLOPT_POST => 1" instead.
  CURLOPT_POSTFIELDS => http_build_query($postArray), //<--Makes your array into application/x-www-form-urlencoded format.
  CURLOPT_HTTPHEADER => array(
    "application/x-www-form-urlencoded" //<---Change type
  )
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

您的新错误是由于您的服务器上未安装相应的证书。这是一个让你入门的链接,如果它没有帮助,那么SO和谷歌就有很多东西。

How do I deal with certificates using cURL while trying to access an HTTPS url?

我添加了CURLOPT_SSL_VERIFYPEER =&gt;您的选项数组为false。这是一个bandaide,直到你可以得到你的证书问题。它可能会将您的数据暴露给可能正在窥探的人。

您的第三个问题与您要发送到数据的数据的类型/格式有关。它期待application / x-www-form-urlencoded并且您已将您的内容类型声明为application / json。

以下是关于这个主题的一些阅读:

How are parameters sent in an HTTP POST request?

application/x-www-form-urlencoded or multipart/form-data?