【问题标题】:cURL working in postman, not in Terminal (for basecamp)cURL 在邮递员中工作,而不是在终端中工作(用于大本营)
【发布时间】:2015-02-20 22:32:37
【问题描述】:

我正在尝试通过 basecamp api 刷新 access_tokens。但是我遇到了一个奇怪的错误。

cURL 请求在 POSTMAN 上运行良好(选项卡:form-data)。但是我尝试了 PHP 中 cURL 的所有配置,但无法使其工作。

这是我正在使用的代码:

$refresh_token = func_to_get_refresh_token();

$data='redirect_uri=xxxxmyredirecturixxxx&client_id=xxxxmyclientidxxx&client_secret=xxxxmyclientsecretxxxxx&refresh_token='.$refresh_token.'&type=refresh';
curl_setopt($ch, CURLOPT_URL, 'https://launchpad.37signals.com/authorization/token');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($ch);

我正在从 Basecamp 服务器返回以下结果:

* upload completely sent off: 448 out of 448 bytes
< HTTP/1.1 400 Bad Request
* Server nginx is not blacklisted
< Server: nginx
< Date: Mon, 09 Feb 2015 08:05:51 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive 
< Status: 400 Bad Request
< X-Request-Id: aaec3a6c61eb5e603672a7a2e004ea7a
< Cache-Control: no-cache
< Set-Cookie: _launchpad_session=BAh7BiIPc2Vzc2lvbl9pZCIlOTEwZTEyOTY0N2M1ZDMxNjM4YjJlZTI2MmRjODE0MTI%3D--7ba9863975db8a7d2c97425300abab8d5405c17a; path=/; HttpOnly; secure
< X-Frame-Options: SAMEORIGIN
< X-Runtime: 0.011202
< Strict-Transport-Security: max-age=31536000
< X-UA-Compatible: IE=Edge,chrome=1
< 
* Connection #0 to host launchpad.37signals.com left intact
{"error":"authorization_expired"}

我已经尝试了几乎所有可以在 stackoverflow 上找到的 cURL 配置。

我们将不胜感激您的帮助。

【问题讨论】:

    标签: php curl postman basecamp


    【解决方案1】:

    将您的 $data 构造为如下数组:

    $data = array(
        'redirect_uri' => 'xxxxmyredirecturixxxx',
        'client_id' => 'xxxxmyclientidxxx',
        'client_secret' => 'xxxxmyclientsecretxxxxx',
        'refresh_token' => 'xxxrefreshtokenofmyaccountxxx',
        'type' => 'refresh'
    );
    

    并将其传递给:

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    

    这将确保您的值经过正确的 URL 编码,并且 Content-Type 标头设置为 multipart/form-data,这显然适用于 POSTman。

    我怀疑问题出在redirect_uri 的 URL 编码上,所以如果 Basecamp 碰巧需要 Content-Typeapplication/x-www-form-urlencoded 而不是 multipart/form-data,您可以使用相同的 $data 数组构造上面,但随后使用:

    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query ($data));
    

    将内容类型设置为application/x-www-form-urlencoded。这仍然会正确地对参数进行 URL 编码。

    【讨论】:

      【解决方案2】:

      下面的小改动起到了作用:

      $refresh_token = rtrim($refresh_token);
      

      事实证明,在将其发送到大本营之前,我必须删除额外的不可见字符(在本例中为字符串结尾字符)。

      【讨论】:

        【解决方案3】:

        我看到完全相同的错误消息,这里的答案都没有帮助我。事实证明,Basecamp 使用 very 长刷新令牌,而我用来存储它们的数据库列仅设置为 VARCHAR(255),这会截断刷新令牌。增加列的大小解决了这个问题。

        【讨论】:

        • 我只是按照您的建议尝试使用更大的字段大小测试我的应用程序。有趣的是,我的字段是“文本”类型,所以这种错误没有范围。对我来说,只需修剪刷新令牌即可。
        猜你喜欢
        • 2016-10-23
        • 2017-10-03
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 2019-08-25
        • 2016-09-11
        相关资源
        最近更新 更多