【问题标题】:How do I make a request using HTTP basic authentication with PHP curl?如何使用带有 PHP curl 的 HTTP 基本身份验证发出请求?
【发布时间】:2011-01-09 13:42:25
【问题描述】:

我正在用 PHP 构建一个 REST Web 服务客户端,目前我正在使用 curl 向服务发出请求。

如何使用 curl 发出经过身份验证的(http 基本)请求?我必须自己添加标题吗?

【问题讨论】:

    标签: php rest curl basic-authentication


    【解决方案1】:

    你想要这个:

    curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);  
    

    Zend 有一个 REST 客户端和 zend_http_client,我确信 PEAR 有某种包装器。 但它很容易自己完成。

    所以整个请求可能看起来像这样:

    $ch = curl_init($host);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml', $additionalHeaders));
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadName);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $return = curl_exec($ch);
    curl_close($ch);
    

    【讨论】:

    • 这比单独设置用户和密码效果更好
    【解决方案2】:

    CURLOPT_USERPWD 基本上发送带有 http 标头的user:password 字符串的 base64,如下所示:

    Authorization: Basic dXNlcjpwYXNzd29yZA==
    

    因此,除了CURLOPT_USERPWD,您还可以使用HTTP-Request 标头选项,如下所示:

    $headers = array(
        'Content-Type:application/json',
        'Authorization: Basic '. base64_encode("user:password") // <---
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    

    【讨论】:

    • 这种传递自定义身份验证标头而不是使用CURLOPT_USERPWD 的方法对我有用。
    【解决方案3】:

    直接使用 CURL 的最简单、最原生的方式。

    这对我有用:

    <?php
    $login = 'login';
    $password = 'password';
    $url = 'http://your.url';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
    $result = curl_exec($ch);
    curl_close($ch);  
    echo($result);
    

    【讨论】:

      【解决方案4】:

      您只需要指定 CURLOPT_HTTPAUTH 和 CURLOPT_USERPWD 选项:

      $curlHandler = curl_init();
      
      $userName = 'postman';
      $password = 'password';
      
      curl_setopt_array($curlHandler, [
          CURLOPT_URL => 'https://postman-echo.com/basic-auth',
          CURLOPT_RETURNTRANSFER => true,
      
          CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
          CURLOPT_USERPWD => $userName . ':' . $password,
      ]);
      
      $response = curl_exec($curlHandler);
      curl_close($curlHandler);
      

      或指定标题:

      $curlSecondHandler = curl_init();
      
      curl_setopt_array($curlSecondHandler, [
          CURLOPT_URL => 'https://postman-echo.com/basic-auth',
          CURLOPT_RETURNTRANSFER => true,
      
          CURLOPT_HTTPHEADER => [
              'Authorization: Basic ' . base64_encode($userName . ':' . $password)
          ],
      ]);
      
      $response = curl_exec($curlSecondHandler);
      curl_close($curlSecondHandler);
      

      Guzzle 示例:

      use GuzzleHttp\Client;
      use GuzzleHttp\RequestOptions;
      
      $userName = 'postman';
      $password = 'password';
      
      $httpClient = new Client();
      
      $response = $httpClient->get(
          'https://postman-echo.com/basic-auth',
          [
              RequestOptions::AUTH => [$userName, $password]
          ]
      );
      
      print_r($response->getBody()->getContents());
      

      见https://github.com/andriichuk/php-curl-cookbook#basic-auth

      【讨论】:

        【解决方案5】:

        与 SOAP 不同,REST 不是标准化协议,因此拥有“REST 客户端”有点困难。但是,由于大多数 RESTful 服务使用 HTTP 作为其底层协议,因此您应该能够使用任何 HTTP 库。除了 cURL,PHP 通过 PEAR 还有这些:

        HTTP_Request2

        替换了

        HTTP_Request

        他们如何进行 HTTP 基本身份验证的示例

        // This will set credentials for basic auth
        $request = new HTTP_Request2('http://user:password@www.example.com/secret/');
        

        也支持Digest Auth

        // This will set credentials for Digest auth
        $request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST);
        

        【讨论】:

        • 通过 REST 客户端,我的意思是抽象出使用 curl 进行 http get、post、put、delete 等的一些低级细节,这就是我通过构建自己的 php 类所做的事情去做这个;我想知道是否有人已经这样做了。
        • 是的,那么您可能会对 HTTP_Request_2 感兴趣。它抽象了 PHP 中很多最丑陋的 cUrl。要设置您使用的方法,setMethod(HTTP_Request2::METHOD_*)。使用 PUT 和 POST,设置请求的正文,您只需 setBody(>)。认证如上所述。它还具有 HTTP 响应的抽象(cUrl 真正缺乏的东西)。
        【解决方案6】:

        如果授权类型是 Basic auth 并且发布的数据是 json 那么这样做

        <?php
        
        $data = array("username" => "test"); // data u want to post                                                                   
        $data_string = json_encode($data);                                                                                   
         $api_key = "your_api_key";   
         $password = "xxxxxx";                                                                                                                 
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL, "https://xxxxxxxxxxxxxxxxxxxxxxx");    
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");  
        curl_setopt($ch, CURLOPT_POST, true);                                                                   
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     
        curl_setopt($ch, CURLOPT_USERPWD, $api_key.':'.$password);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(   
            'Accept: application/json',
            'Content-Type: application/json')                                                           
        );             
        
        if(curl_exec($ch) === false)
        {
            echo 'Curl error: ' . curl_error($ch);
        }                                                                                                      
        $errors = curl_error($ch);                                                                                                            
        $result = curl_exec($ch);
        $returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);  
        echo $returnCode;
        var_dump($errors);
        print_r(json_decode($result, true));
        

        【讨论】:

          【解决方案7】:

          对于那些不想使用 curl 的人:

          //url
          $url = 'some_url'; 
          
          //Credentials
          $client_id  = "";
          $client_pass= ""; 
          
          //HTTP options
          $opts = array('http' =>
              array(
                  'method'    => 'POST',
                  'header'    => array ('Content-type: application/json', 'Authorization: Basic '.base64_encode("$client_id:$client_pass")),
                  'content' => "some_content"
              )
          );
          
          //Do request
          $context = stream_context_create($opts);
          $json = file_get_contents($url, false, $context);
          
          $result = json_decode($json, true);
          if(json_last_error() != JSON_ERROR_NONE){
              return null;
          }
          
          print_r($result);
          

          【讨论】:

            【解决方案8】:

            基本方法的其他方式是:

            $curl = curl_init();
            
            $public_key = "public_key";
            $private_key = "private_key";
            
            curl_setopt_array($curl, array(
            CURLOPT_URL => "https://url.endpoint.co/login",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_HTTPHEADER => array(
            "Content-Type: application/json",
            "Authorization: Basic ".base64_encode($public_key.":".$private_key)
            ),
            ));
            $response = curl_exec($curl);
            curl_close($curl);
            echo $response;
            

            【讨论】:

            • 是的,这适用于发送带有用户名和密码的基本身份验证标头。
            【解决方案9】:

            Yahoo 有一个使用 PHP 调用其 REST 服务的教程:

            Make Yahoo! Web Service REST Calls with PHP

            我自己没有使用过它,但雅虎就是雅虎,至少应该保证一定程度的质量。不过,它们似乎没有涵盖 PUT 和 DELETE 请求。

            另外,User Contributed Notes to curl_exec() 和其他人包含很多很好的信息。

            【讨论】:

              【解决方案10】:

              Michael Dowling 非常积极地维护Guzzle 是一个不错的选择。除了优雅的界面、异步调用和 PSR 合规性之外,它还使 REST 调用的身份验证标头变得非常简单:

              // Create a client with a base URL
              $client = new GuzzleHttp\Client(['base_url' => 'http://myservices.io']);
              
              // Send a request to http://myservices.io/status with basic authentication
              $response = $client->get('/status', ['auth' => ['username', 'password']]);
              

              见the docs。

              【讨论】:

                【解决方案11】:

                那里有多个 REST 框架。我强烈建议您查看Slim mini Framework for PHP
                Here 是其他人的列表。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-10-07
                  • 2014-08-14
                  • 1970-01-01
                  • 2019-05-05
                  相关资源
                  最近更新 更多