QUOINEXのAPIを使ってみたけどPHPでJWT認証が通らなかった。という記事を書いたのですが、仕組みを理解した上で再チャレンジ。
PHPでAPIのリクエストを送る場合は、大きく分けると、「ヘッダーデータ作成」「JWT認証」「PHPのHTTPリクエスト」に分けることができます。
ヘッダーデータ作成とJWT認証の部分は、jwt.ioのDegubberを使って確認できます。自分の作成したエンコードしてJWT認証したデータをechoなどで出力して、ここにコピペします。「HEADER」や「PAYLOAD」が正しいかを確認してみました。
特に問題なさそう・・・。
となると、HTTPリクエストの作成が悪い。
ということで調べていたら、全ての元凶はヘッダーリクエストデータ書式でした。
ダメなヘッダーデータ
$header = array( 'X-Quoine-API-Version : 2', 'X-Quoine-Auth : ' .$jwt, 'Content-Type : application/json' );
OKなヘッダーデータ
$header = array( 'X-Quoine-API-Version: 2', 'X-Quoine-Auth: ' .$jwt, 'Content-Type: application/json' );
違いは、「パラメータ」と「:(コロン)」の間にスペースがあるかないか。あるとリクエストNGです・・・。
それを踏まえたQUOINEXのJWT認証のソースコードはこちら。
今回のJWT認証では、https://jwt.io/の「composer require firebase/php-jwt」を使いました。
Githubからfirebase/php-jwtのライブラリを「Clone or Download」から取得します。今回はcomposerをつかわないので、全てrequire_onceで読み込ませています(解凍したライブラリをフォルダ名jwtに変更して利用)。
//firebaseのJWTライブラリ読み込み define('MYSITE_SERVER_ROOT',$_SERVER['DOCUMENT_ROOT'].'/functions'); require_once(MYSITE_SERVER_ROOT.'/jwt/BeforeValidException.php'); require_once(MYSITE_SERVER_ROOT.'/jwt/ExpiredException.php'); require_once(MYSITE_SERVER_ROOT.'/jwt/SignatureInvalidException.php'); require_once(MYSITE_SERVER_ROOT.'/jwt/JWT.php'); use \Firebase\JWT\JWT; //アカウント情報 function qx_get_balance () { //マイページで取得したAPIキーとAPIsecretキー $key = 'xxxxxxxx'; $secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'; //リクエストURL $base_url = 'https://api.quoine.com'; $path = '/fiat_accounts'; $url = $base_url.$path; $nonce = time(); //ヘッダーデータ $payload = [ "path" => $path, "nonce" => $nonce, "token_id" => $key, ]; //JWTライブラリでエンコード $jwt = JWT::encode($payload, $secret); //リクエストヘッダー作成(https://developers.quoine.com/#authenticationで指定されている方法) $header = array( 'X-Quoine-API-Version: 2', 'X-Quoine-Auth: ' .$jwt, 'Content-Type: application/json' ); //リクエスト初期化 $ch = curl_init(); //リクエストオプション設定 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //リクエスト実行&終了 $response = curl_exec($ch); curl_close($ch); //jsonデコード $result = json_decode($response, true); var_dump($result); return $result; }