PowerCMS X ブログ
2024-03-25
PowerCMS XのRESTful APIをPHPで利用する際、ユーザー認証周りをどのように記述すれば良いか?というご質問を頂きました。
回答ですが、まずauthenticationエンドポイントを利用して認証を行いアクセストークンを発行します。cURL関数を利用しました。
<?php
$headers = [
'Content-Type: application/json',
];
$data = [
'name' => 'username',
'password' => 'password',
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, "https://powercmsx.localhost/app/api/v1/authentication");
$response = curl_exec($ch);
$data = json_decode($response);
$token = $data->access_token;
curl_close($ch);
次に、insertエンドポイント(記事の追加)、getエンドポイント(公開以外の記事を取得)等を利用する際に、先程取得したアクセストークンをリクエストヘッダーに追加してリクエストを実行します。「X-PCMSX-Authorization」リクエストヘッダーにトークンをセットするのがポイントです。
$headers = [
'Content-Type: application/json',
"X-PCMSX-Authorization: {$token}", // ここでアクセストークンをセットする
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, "https://powercmsx.localhost/app/api/v1/0/entry/get/15000");
$response = curl_exec($ch);
$entry = json_decode($response);
curl_close($ch);
var_dump($entry->title); // タイトルが表示されます
上記コードで認証が必要なエンドポイントを利用できるのですが、オプション設定やデータを変更しつつ2回cURL関数を実行しなければならないところが少々大変です。コードを上手くまとめられないとcURL関数やAPIのURLが何度も登場し、メンテナンス性が低下します。そこで、PowerCMS XのRESTful APIをPHPで素早く・簡単に利用するためのライブラリを書いてみました。
先にご紹介したユーザー認証を行い公開以外の記事を取得するコードをPowerCMS X RESTful API PHP Clientを用いたコードに書き換えると以下のようになります。約30行ほどのコードが7行になりました。
require_once 'path' . DS . 'to' . DS . 'ClientBuilder.php'; // 適宜調整してください
use PowerCMSX\RESTfulAPI\ClientBuilder;
$client = ClientBuilder::create()
->setApplicationUrl('https://powercmsx.localhost/app/api')
->setAuthConfig('username', 'password');
$entry = $client->getObject('entry', 0, 15000, true);
var_dump($entry->title); // タイトルが表示されます
他のサンプルもリポジトリのexamplesディレクトリに格納しております。
また、列挙型でステータスの定義をしており、エディタのインテリセンス機能と併用することで容易に希望のステータスが設定できるようになっています。
use PowerCMSX\ObjectStatus;
$data = [
'title' => 'APIのテスト',
'basename' => 'api_test',
'status' => ObjectStatus::ApprovalPending->value, // 2が出力されオブジェクトは承認待ちになる
];
サイト間連係(複数のPowerCMS Xでデータを連係する)や基幹システムのデータインポートをRESTful APIで行う場合に、本記事の内容が参考になれば幸いです。なお、JavaScriptの場合はRESTful API JavaScript SDKがありますので、あわせてご利用ください。
画像やPDFファイル等のバイナリデータをRESTful APIで登録するにはファイルをData URIスキーム変換する必要がありますが、変換処理をAssetUtilities::encodeBase64
メソッドで簡単に実行できるようにしました。
// パスは適宜合わせてください
require_once 'path/to/powercmsx/app/lib/Prototype/class.PTUtil.php';
require_once 'path/to/ClientBuilder.php';
require_once 'path/to/src/classes/AssetUtilities.php';
use PowerCMSX\RESTfulAPI\ClientBuilder;
use PowerCMSX\RESTfulAPI\AssetUtilities;
$client = ClientBuilder::create()
->setApplicationUrl('https://powercmsx.localhost/app/api')
->setAuthConfig('username', 'password');
$data = [
'assets' => [
[
'file' => [
'Label' => 'ラベルまたは代替テキスト',
'Data' => AssetUtilities::encodeBase64(__DIR__ . '/assets/test.png'), // AssetUtilities::encodeBase64にアップロードしたいファイルのパスを渡します
'Path' => '%r/assets/test.png',
]
]
]
];
$entry = $client->createObject('entry', 0, $data);
カテゴリー:技術情報
投稿者:安倍