web-dev-qa-db-ja.com

Guzzleを使用してHTTP基本認証を行うにはどうすればよいですか?

Guzzleを使用して基本的なアクセス認証を行いたいのですが、プログラミングは初めてです。何をすればいいのかわからない。 curlを使用してこれを実行しようとしましたが、私の環境ではguzzleを使用する必要があります。

50
Gopi K Mishra

Guzzle 5.0以降を使用している場合、 ドキュメント authパラメーターを使用して基本認証が指定されていると言います:

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

Guzzle 3.0以前を使用している場合は、 構文が異なる に注意してください。コンストラクターは異なります。また、応答を取得するには、要求でsendメソッドを明示的に使用する必要があります。

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

@amenadielの回答に加えて。コンストラクターで認証パラメーターを指定すると便利な場合があります。

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

その後、すべてのリクエストはこのデフォルトの認証パラメータを使用します。

18
mnv

私がGuzzlev6を使用し、@ amenadielからのアドバイスを使用したとき、この気の利いた仕事ができました。 curlを使用すると、構文は次のようになります

curl -u[email protected]:passwordhttp://service.com

舞台裏では、実際に "[email protected]:password"ビットを取り、base64がエンコードして、 "Authorization"エンコードされた値を持つヘッダー。この例では、次のようになります。

許可:基本c29tZW9uZUBnbWFpbC5jb206cGFzc3dvcmQ =

@amenadielからのアドバイスに "auth:username、password"ヘッダーが追加されたため、認証が失敗し続けました。これを成功させるには、Guzzle Clientリクエストをインスタンス化するときにヘッダーを作成するだけです。つまり、

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

これはcurlと同じようにヘッダーを追加し、接続しようとしているサービスは何でもあなたに怒鳴りますが、

乾杯。

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

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()を使用しているため、使用する必要はありません。

私はテストしましたが、動作します:)

詳細については、 Guzzle 6ドキュメント

10
Eric Gruby

@ bourgeois247がbase64エンコーディングについて言ったことによると、Guzzle 6では次のことが完璧に機能しました。

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

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

3
HRoux