php 如何使用Guzzle进行HTTP基本身份验证?

iswrvxsc  于 2023-01-29  发布在  PHP
关注(0)|答案(8)|浏览(426)

我想用Guzzle做基本的访问认证,我对编程很陌生,我不知道该怎么做,我试着用curl做,但是我的环境需要使用Guzzle。

u3r8eeie

u3r8eeie1#

如果您使用的是Guzzle 5.0或更高版本,文档中说明基本身份验证是使用auth参数指定的:

$client = new GuzzleHttp\Client();
$response = $client->get('http://www.server.com/endpoint', [
    'auth' => [
        'username', 
        'password'
    ]
]);

请注意,如果您使用的是Guzzle 3.0或更早版本,则syntax is different.构造函数是不同的,并且您还需要在请求上显式使用send方法来获得响应:

$client = new Guzzle\Http\Client();
$request = $client->get('http://www.server.com/endpoint');
$request->setAuth('username', 'password');
$response = $request->send();

一个简短的附录

对于@Matthwew-Knill的回答,是的,您可以设置一个默认授权,并隐式地让Guzzle在以后的每个请求中发送它。@Nick的回答很中肯。客户端构造函数接受您能想到的每个参数,然后是一些参数。
另一种方法,如果你想创造性的话,可以示例化客户端,传递它的默认头,在以后的每一个请求中发送。简单auth毕竟是一个Authorization头,计算如下:

$client = new Client([
  'headers'=>[
       'Authorization'=> Basic base64_encode(<username>:<password>)
   ]
 ]);

最后但并非最不重要的是,请注意,填写一个简单的验证对话框只发生一次(在第一次访问一个给定的会话)。这通常是通过设置一个cookie在访问者的浏览器。该cookie反过来包含足够的信息,服务器识别其匹配的活动会话。
通常,Guzzle请求是无状态的,但是您可以使用中间件链来配置Guzzle,以修改请求或响应,用于调试目的,并且在本用例中,记住cookie,从而成为部分有状态的。
请查看Guzzle Docs中的详细过程。重要的是,通过使用cookiejar中间件示例化客户端,从而让客户端从那时起包含它,第一个请求将记住服务器的set-cookie头,并将其作为每隔一个cookie头发送,使服务器将客户端识别为登录用户。当然,您也可以自己检查第一个响应的报头,然后发送其值。
可能还有其他办法,但我现在想不出其他办法。

ca1c2owp

ca1c2owp2#

除了@amenadiel应答。有时方便在构造函数中指定auth参数:

$client = new Client([
    'auth' => ['username', 'password'],
]);

那么每个请求都将使用这个默认的auth参数。

am46iovg

am46iovg3#

当我使用Guzzlev6并使用@amenadiel的建议时,这一点很有效。
curl-u某人@gmail.com:密码http://service.com
在后台,它实际上接受**"www.example.com:password"位,base64对其进行编码,并发送带有"Authorization"标头和编码值的请求。对于本例,这将是:someone@gmail.com:password"bit, base64 encodes it and sends the request with an"Authorization"**Header with the encoded value. For this example, that will be:
授权:基本值=
@amenadiel的建议附加了
"授权:username,password "**头,因此我的身份验证一直失败。要成功实现这一点,只需在示例化Guzzle客户端请求时创建头,即

$client = new GuzzleHttp\Client();
$credentials = base64_encode('someone@gmail.com:password');
$response = $client->get('http://www.server.com/endpoint', [
    'Authorization' => ['Basic '.$credentials]
]);

这将像curl那样附加头,无论您尝试连接到什么服务,都将停止对您大喊大叫,
干杯。

mxg2im7a

mxg2im7a4#

根据Guzzle 6文档,您可以使用基本授权执行请求,如下所示:

$client = new Client();

$response = $client->request(
    'POST', /*instead of POST, you can use GET, PUT, DELETE, etc*/
    $url,
    [
      'auth' => ['username', 'password'] /*if you don't need to use a password, just leave it null*/
    ] 
);

echo $response->getBody();
    • 注意:**您根本不需要使用base64_encode(),因为它在请求之前就已经这样做了。

我已经测试过了,它的工作:)
更多信息请访问:狂饮6文档

cnjp1d6j

cnjp1d6j5#

$response = $client->request( 'GET', 'your_url', [
                    'auth'    => [
                        'your_username',
                        'your_password'
                    ],
                    'headers' => [
                        'if you want to pass something in the headers'
                    ]
                ]
            );
o3imoua4

o3imoua46#

您还可以在示例化客户端时配置auth参数,而不是将其添加到每个请求中:

$this->client = new \GuzzleHttp\Client([                                                                                                                                             
    'base_uri' => $this->endpoint,                                                                                                                                                   
    'headers' => [                                                                                                                                                                   
        'Authorization' => ['Basic '.base64_encode($this->username.':'.$this->password)],                                                                                                 
    ],                                                                                                                                                                               
]);

以下是Guzzle 6的各种文档链接:

vzgqcmou

vzgqcmou7#

根据@assourgesis247关于base64编码的说法,以下代码在我的Guzzle 6上运行得非常完美:

$client = new Client();
$credentials = base64_encode('username:password');
$response = $client->post('url',
        [
            'headers' => [
                'Authorization' => 'Basic ' . $credentials,
            ],
        ]);
x7rlezfr

x7rlezfr8#

如果将其与symfony一起使用,还可以在配置文件中定义它(对于symfony4为config/packages/eight_points_guzzle. yaml,对于其他版本为flex或config. yml)
在配置文件中:

eight_points_guzzle:
    clients:         
        your_service:
            # Write here the host where to do requests
            base_url: "yourURL"

            options:
                timeout: 30
                auth:
                    - yourLogin     # login
                    - yourPassword # password
            plugin: ~

然后,在您的服务,控制器等....

$client  = $this->getContainer()->get('eight_points_guzzle.client.your_service');
$response = $client->get('yourRoute');

参见:https://packagist.org/packages/eightpoints/guzzle-bundle

相关问题