如何使用cURL和PHP使用Oauth2

时间:2018-05-15 09:29:48

标签: php curl

我无法使用下载脚本:

我正在使用名为swiftdil的api。他们的例子如下:

示例请求:

curl -X POST https://sandbox.swiftdil.com/v1/oauth2/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-u 'your_username:your_password'

示例输出:

{
"access_token":"your_access_token",
"expires_in": 3600,
"refresh_expires_in": 1800,
"refresh_token": "your_refresh_token",
"token_type": "bearer",
"not-before-policy": 0,
"session_state": "your_session_state"
}

因此,我提交凭据的网址为https://sandbox.swiftdil.com/v1/oauth2/token

我尝试过以下代码:

               // Api Credentials
                $url = 'https://sandbox.swiftdil.com/v1/oauth2/token';
                $username = "my_username";
                $password = "my_password";


                // Set up api environment

                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: 
                application/x-www-form-urlencoded'));
                curl_setopt($ch, CURLOPT_HEADER, 1);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . 
                $password);


                // Give back curl result
                $output = curl_exec($ch);
                $info = curl_getinfo($ch);
                $curl_error = curl_error($ch);
                curl_close($ch);
                print_r($output);
                print_r($info);
                print_r($curl_error);
?>

脚本给了我以下结果:

HTTP/1.1 400 Bad Request Server: nginx/1.13.8 Date: Tue, 15 May 2018 09:17:26 GMT Content-Type: text/html Content-Length: 173 Connection: close

400错误请求。

我错过了什么吗?我满足上面给出的例子的需要吗?我确实做了一个postcall,按要求提供所有的证明,但仍然无法得到任何回报。

2 个答案:

答案 0 :(得分:2)

我不是PHP开发人员,我主要做JavaScript。当我与其他REST服务集成时,我倾向于使用Postman(https://www.getpostman.com/)。

尝试以下方法:

  1. 尝试使用Postman成功连接API(应该相对简单)。

  2. 成功后,Postman可以自动生成PHP代码,然后您可以复制和粘贴。像JavaScript的魅力一​​样,不知道为什么它与PHP会有所不同。

  3. 我根据你提供的内容填写邮递员的详细信息:

    <?php
    
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://sandbox.swiftdil.com/v1/oauth2/token",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_HTTPHEADER => array(
        "Authorization: Basic bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=",
        "Content-Type: application/x-www-form-urlencoded"
      ),
    ));
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
      echo "cURL Error #:" . $err;
    } else {
      echo $response;
    }
    

    请注意,&#39;授权:基本&#39;可以用作基本的授权机制而不是“承载”#39; (它也应该工作)。所以替换&#39; bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ&#39;使用base64编码的字符串&#39;用户名:密码&#39; (使用实际的用户名和密码)。

答案 1 :(得分:0)

您还需要根据数据设置以下选项来设置卷曲帖子字段。

"curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri,
'grant_type' => 'authorization_code'
))";

If still not work, you can find the curl error as :

if(curl_error($ch))
{
    echo 'error:' . curl_error($ch);
}