在 OAuth 2.0 中交换访问令牌的授权代码
Exchange the Authorization Code for an Access Token In OAuth 2.0
我正在尝试使用 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;
}
?>
您在 post 字段中的 json 字符串不是有效的 json 字符串。您可以在此处测试 json:
您可以尝试用 post 字段填充一个数组,然后使用 json_encode() 将该数组编码为您的 curl 请求中的 json 字符串。这将有助于减少创建 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;
}
您的新错误是由于您的服务器上没有安装适当的证书造成的。这里有一个 link 可以帮助您入门,如果它没有帮助,SO 和 google 有很多关于这个的东西。
我在您的选项数组中添加了 CURLOPT_SSL_VERIFYPEER => false。在您解决证书问题之前,这是一个创可贴。它确实有可能将您的数据暴露给可能正在窥探的人。
您的第三个问题与您要发送给数据的数据的 type/format 有关。它期待 application/x-www-form-urlencoded 并且您已将您的内容类型声明为 application/json。
这里是关于这个主题的一些读物:
application/x-www-form-urlencoded or multipart/form-data?
我正在尝试使用 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;
}
?>
您在 post 字段中的 json 字符串不是有效的 json 字符串。您可以在此处测试 json:
您可以尝试用 post 字段填充一个数组,然后使用 json_encode() 将该数组编码为您的 curl 请求中的 json 字符串。这将有助于减少创建 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;
}
您的新错误是由于您的服务器上没有安装适当的证书造成的。这里有一个 link 可以帮助您入门,如果它没有帮助,SO 和 google 有很多关于这个的东西。
我在您的选项数组中添加了 CURLOPT_SSL_VERIFYPEER => false。在您解决证书问题之前,这是一个创可贴。它确实有可能将您的数据暴露给可能正在窥探的人。
您的第三个问题与您要发送给数据的数据的 type/format 有关。它期待 application/x-www-form-urlencoded 并且您已将您的内容类型声明为 application/json。
这里是关于这个主题的一些读物:
application/x-www-form-urlencoded or multipart/form-data?