我怎样才能让 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
我有以下 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