我怎样才能让 Guzzle 与 CURLOPT_USERPWD 一起工作?

How can I get Guzzle to work with CURLOPT_USERPWD?

我有以下 PHP curl 代码来在应用程序中生成安全令牌。 当我 运行 这段代码时它工作完美。

    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, 'https://host.com/api/v1/auth/keys');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "{}");
    curl_setopt($ch, CURLOPT_USERPWD, 'admin' . ':' . 'password');
    
    $headers = array();
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Accept: application/json';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    }
    curl_close($ch);

但目前我需要这个 Curl 脚本的 Guzzle 版本,这就是这个问题的起点。

我发现了在 Guzzle 中处理身份验证的不同方法,但到目前为止没有任何效果。

这是我想出来的。

       use GuzzleHttp\Client;
        
        include "../vendor/autoload.php";
        
        try{
        
          $client = new Client(['base_uri' => 'https://host.com/api/v1/']);
          
          $client->request('POST', 'auth/keys',[
              'config' => [
                'curl' => [
                  // CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
                    CURLOPT_USERPWD  => 'admin:password'
                ]
              ],
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept'       => 'application/json',
                ]
                ]);
        
            print_r($client->getBody()->getContents());
            
          }catch (Exception $e) {
            print_r([
                "status" => false,
                "message" => $e->getMessage()
            ]);
        }

我没有返回安全令牌,而是收到一条错误消息“401 Unauthorized` response”——这意味着没有收到正确的身份验证。

我到底做错了什么?

提前致谢。

我相信您不太了解如何在 guzzle 中使用 curl 选项 仅使用 curl 作为请求选项,无需使用配置。(参见 docs

<?php
require "../vendor/autoload.php";

use GuzzleHttp\Client;
    
    try{
    
      $client = new Client(['base_uri' => 'https://host.com/api/v1/']);
      
      $guzzleResponse = $client->request('POST', 'auth/keys', [
                'curl' => [
                  CURLOPT_USERPWD  => 'admin:password'
                ],
              
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept'       => 'application/json',
                ]
            ]);
    
        print_r($guzzleResponse->getBody()->getContents());
        
    } catch (GuzzleHttp\Exception\RequestException $e) {
        print_r([
            "status" => false,
            "message" => $e->getMessage(),
        ]);// you can use logs here like monolog library
    } catch(Exception $e){
        print_r([
            "status" => false,
            "message" => $e->getMessage(),
        ]);
    }

方法二

参考this回答,相信你也可以使用Basic Auth http header。

$encodedAuth = base64_encode( $usename.":".$passwd);

// ... other same as above

 $guzzleResponse = $client->request('POST', 'auth/keys', [
                'headers' => [
                    'Authorization' => 'Bearer '. $encodedAuth,
                    'Content-Type' => 'application/json',
                    'Accept'       => 'application/json',
                ]
            ]);
// ... other same as above