【问题标题】:Exchange the Authorization Code for an Access Token In OAuth 2.0在 OAuth 2.0 中交换访问令牌的授权码
【发布时间】:2018-09-30 16:01:34
【问题描述】:

我正在尝试使用 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;
}
?>

【问题讨论】:

  • 是那些 CURLOPT_URL 等常量值吗?如果不尝试将它们中的每一个都包含在 " 或 ' 中,例如:'CURLOPT_URL',这很可能是由语法错误引起的。
  • 尝试将 CURLOPT_POST => 1 添加到选项数组而不是 CURLOPT_CUSTOMREQUEST => "POST",

标签: php oauth-2.0 oauth2client


【解决方案1】:

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

https://jsonlint.com/

您可以尝试使用您的帖子字段填充一个数组,然后在您的 curl 请求中使用 json_encode() 将该数组编码为一个 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;
}

您的新错误是由于您的服务器上没有安装适当的证书造成的。这是一个让您入门的链接,如果它没有帮助,那么 SO 和谷歌在这方面有很多东西。

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

我将 CURLOPT_SSL_VERIFYPEER => false 添加到您的选项数组中。在您弄清楚证书问题之前,这是一个创可贴。它确实可能会将您的数据暴露给可能正在窥探的人。

您的第三个问题与您要发送到的数据的类型/格式有关。它期待 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?

【讨论】:

  • 我尝试了建议的代码,我认为它有所帮助,但它现在有一个不同的错误:cURL 错误 #:error setting certificate verify locations: CAfile: C:\Program Files (x86)\Parallels\ Plesk\Additional\PHPSettings\cacert.pem CApath: 无
  • 这可能有几个原因,但请尝试将 CURLOPT_SSL_VERIFYPEER => false 添加到选项数组中
  • 我做了刚才建议的更改,现在得到错误:{"error":"invalid_request","error_description":"mandatory: Content-Type -> application/x-www-form-urlencoded "}
  • @Rick 该错误表明您将 url 发送到的页面要求您的内容类型为 application/x-www-form-urlencoded 而不是 application/json。尝试在您的 curl 请求中更改它。您可能还必须对您的 json 字符串进行 urlencode。看起来我已经成功回答了你的几个问题。请将此标记为已接受,然后对此主题进行一些研究。如果您找不到答案,请在 SO 上发布另一个问题,并让其他可能对此主题有所了解的成员帮助您。谢谢,祝你好运。
  • 谢谢。我将其更改为:“内容类型:应用程序/x-www-form-urlencoded”。现在我收到以下错误: {"error":"invalid_request","error_description":"invalid grant type"} 我们需要更改一些语法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2020-08-05
  • 2014-12-31
  • 2020-11-20
  • 2020-12-11
相关资源
最近更新 更多