Je veux faire l'authentification d'accès de base en utilisant Guzzle et je suis très nouveau en programmation. Je n'ai aucune idée de quoi faire. J'ai essayé de le faire en utilisant curl mais mon environnement nécessite l'utilisation de la gueule.
Si vous utilisez Guzzle 5.0 ou une version plus récente , la documentation déclarez que l’authentification de base est spécifiée à l’aide du paramètre auth:
$client = new GuzzleHttp\Client();
$response = $client->get('http://www.server.com/endpoint', [
'auth' => [
'username',
'password'
]
]);
Veuillez noter que le la syntaxe est différente si vous utilisez Guzzle 3.0 ou une version antérieure . Le constructeur est différent et vous devez également utiliser explicitement la méthode send
sur une requête pour obtenir une réponse:
$client = new Guzzle\Http\Client();
$request = $client->get('http://www.server.com/endpoint');
$request->setAuth('username', 'password');
$response = $request->send();
En plus de @amenadiel, répondez. Parfois utile, spécifier les paramètres d'authentification dans le constructeur:
$client = new Client([
'auth' => ['username', 'password'],
]);
Chaque requête utilisera ensuite ces paramètres d'authentification par défaut.
Ce travail a fonctionné lorsque j'ai utilisé Guzzlev6 et utilisé les conseils de @amenadiel. Lorsque vous utilisez curl, votre syntaxe ressemble à quelque chose comme:
curl -u quelqu'[email protected]: mot de passe http://service.com
dans les coulisses, il prend le "quelqu'[email protected]: mot de passe" , base64 le code et envoie la requête avec un "Autorisation" En-tête avec la valeur encodée. Pour cet exemple, ce sera:
Autorisation: Basic c29tZW9uZUBnbWFpbC5jb206cGFzc3dvcmQ =
Les conseils de @amenadiel ont ajouté un en-tête "auth: nom d'utilisateur, mot de passe" et mon authentification a donc continué à échouer. Pour y parvenir, il suffit de créer l’en-tête lorsque vous instanciez une demande du client Guzzle, c.-à-d.
$client = new GuzzleHttp\Client();
$credentials = base64_encode('[email protected]:password');
$response = $client->get('http://www.server.com/endpoint', [
'Authorization' => ['Basic '.$credentials]
]);
Cela ajouterait l'en-tête comme curl, et quel que soit le service auquel vous essayez de vous connecter, cessez de vous crier dessus,
À votre santé.
$response = $client->request( 'GET', 'your_url', [
'auth' => [
'your_username',
'your_password'
],
'headers' => [
'if you want to pass something in the headers'
]
]
);
Selon la documentation de Guzzle 6 , vous pouvez faire une demande avec une autorisation de base aussi simple que celle-ci:
$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();
REMARQUE: Vous n'avez pas du tout besoin d'utiliser base64_encode () car il le fait déjà avant la demande.
J'ai testé et ça marche :)
Voir plus à: Documentation de Guzzle 6
Selon ce que @ bourgeois247 a dit à propos de l'encodage en base64, les éléments suivants ont parfaitement fonctionné pour moi sur Guzzle 6:
$client = new Client();
$credentials = base64_encode('username:password');
$response = $client->post('url',
[
'headers' => [
'Authorization' => 'Basic ' . $credentials,
],
]);
Si vous l'utilisez avec symfony, vous pouvez également le définir dans votre fichier de configuration (config/packages/eight_points_guzzle.yaml pour symfony4 ou flex ou config.yml pour l'autre version)
Dans votre fichier de configuration:
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: ~
Ensuite, dans votre service, contrôleur, etc ....
$client = $this->getContainer()->get('eight_points_guzzle.client.your_service');
$response = $client->get('yourRoute');
Voir: https://packagist.org/packages/eightpoints/guzzle-bundle