BTC:--
ETH:--
BCH:--
XRP:--

QUOINEXのAPIのJWT認証をPHPで通してみた。

QUOINEXのAPIのJWT認証をPHPで通してみた。

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;
}
メニューを閉じる