GuzzleでBasic認証

公式ドキュメントはきちんと読みましょう、という話ではあるのですが。

base64エンコードしたものを投げていて通らず、だいぶ後になってから気付いたのでメモ。

{
    "name": "arm-band/basic_test",
    "description": "",
    "require": {
        "guzzlehttp/guzzle": "^6.5.2",
        "vlucas/phpdotenv": "^v4.1.0"
    },
    "scripts": {
        "start": "php src/index.php"
    }
}

こんな形でcomposer.jsonを用意してあげて、以下のようなディレクトリ構造とプロジェクトを作ります。

/
├ src/
|  └ index.php
├ .env
└ composer.json

.envは以下のような形で。

TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SECRET=YYYYYYYYYYYYYYYYYYYYYYYYYYYYY

最後に、src/index.phpを用意。

<?php
require __DIR__ . '/../vendor/autoload.php';
use GuzzleHttp\Client;
use Dotenv\Dotenv;

$dot_env = __DIR__. '/../.env';
if (is_readable($dot_env)) {
    $dotenv = Dotenv::createImmutable(__DIR__. '/../');
    $dotenv->load();
}

//処理
function basic_authentication_request() {
    $guzzleClient = new Client();
    //URL
    $base = 'https://example.jp/api';

    try {
        $response = $guzzleClient->request(
            'POST',
            $url,
            [
                'auth' => [
                    getenv('TOKEN'),
                    getenv('SECRET'),
                ],
                'version' => 1.1,
                'json' => ['hoge' => ['piyo', 'fuga']],
                'headers' => [
                    'Content-Type' => 'application/vnd.json+api'
                ],
            ]
        );
        return json_decode($response->getBody()->getContents(), true);
    } catch (Exception $e) {
        return json_decode('{"res":' . unicode_encode($e->getResponse()->getBody()->getContents()) . ',' . $test_res . '}', true);
    }
}

$response = basic_authentication_request();

header("Content-type: application/json; charset=UTF-8");

echo $response;

GuzzleにはリクエストヘッダにBasic認証を行うためのauthというパラメータがあるため、これを使えば良いというオチでした。

これに気付かず、Authentication: Basic ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZという形をheadersに付けていました……。

参考

Guzzle

authパラメータ

base64エンコード(今回は最終的に不採用)

PHPでユニコードエスケープ(レスポンスがユニコードエスケープされたエラー文だと読めないので)

この記事を書いた人

アバター

アルム=バンド

フルスタックエンジニアっぽい何か。LAMPやNodeからWP、gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。