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

我想用 Guzzle 做 HTTP基本认证,而且我对编程还是个新手。我不知道该怎么办。我试着用卷曲来做这件事,但是我的环境要求我使用暴饮暴食。

117652 次浏览

如果您使用的是 狂饮5.0或更新版本,那么 那些文件会说,基本 auth 是使用 auth 参数指定的:

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

如果您使用的是 狂饮3.0或更早,请注意 语法是不同的。构造函数是不同的,您还需要对请求显式使用 send方法来获得响应:

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

一个简短的附录

对于@Matthwew-Knill,是的,您可以设置一个默认授权,并隐式地让 Guzzle 在每个进一步请求中发送它。@ 尼克的回答恰到好处。客户机构造函数接受您能想到的所有参数,然后接受一些参数。

另一种方法是实例化客户机,将其默认头传递给客户机,以发送每个进一步的请求。毕竟,简单认证是 Authorization头文件。计算结果如下:

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

最后但并非最不重要的是,请注意填写一个简单的 auth 对话框只发生一次(在给定会话的第一次访问时)。这通常是通过在访问者的浏览器上设置 cookie 来实现的。该 cookie 反过来包含足够的信息,以便服务器识别匹配的活动会话。

通常,Guzzle 请求是无状态的,但是您可以使用一个中间件链来配置 Guzzle,以修改请求或响应,用于调试目的,并且在这个用例中,可以记住 cookies,从而变得部分有状态。

请查看 GuzzleDocs 中的详细程序。重要的是,通过使用 Cookiejar 中间件实例化客户端,从而让客户端从此包含它,第一个请求将记住服务器的 set-cookie头,并将其作为每个进一步的 cookie头发送,使服务器将客户端识别为登录用户。当然,您也可以自己检查第一个响应的头,然后发送它的值。

也许还有别的办法,但我现在想不出来。

当我使用 Guzzlev6并使用@amenadiel 的建议时,这种力量起作用了。使用 curl 时,语法类似于

旋度-u

在后台,它实际上获取 “ someone@gmail.com: password”位,base64对其进行编码,并使用带有编码值的 “授权” Header 发送请求。对于这个例子,它将是:

授权: 基本 c29tZW9uZUBnbWFpbC5jb206cGFzc3dvcmQ =

@ amenadiel 的建议附加了一个 “ auth: 用户名,密码”头,因此,我的身份验证一直失败。要成功实现这一点,只需在实例化一个 GuzzleClient 请求时制作头部,即

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

这会像 curl 一样附加标题,无论你想连接到什么服务,都不会对你大喊大叫,

干杯。

除了@amenadiel 的回答之外,有时候还可以在构造函数中指定 auth 参数:

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

然后,每个请求都将使用这个默认认证参数。

根据@bouris247关于 base64编码的说法,以下内容对我在 Guzzle6上的表现非常好:

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

根据 狂饮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文件

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

如果将其与 symfony 一起使用,还可以在配置文件(config/package/Eight _ points _ guzzle)中定义它。Yaml 用于 symfony4或 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

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

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

以下是 Guzzle6的各种文档链接:

 $client = new Client();
$response = Http::withBasicAuth($username,$password)
->post($url);