PowerCMS X ブログ

2024-03-25

RESTful APIを用いたユーザー認証とPHP Clientのご紹介

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); // タイトルが表示されます

PowerCMS X RESTful API PHP Clientのご紹介

上記コードで認証が必要なエンドポイントを利用できるのですが、オプション設定やデータを変更しつつ2回cURL関数を実行しなければならないところが少々大変です。コードを上手くまとめられないとcURL関数やAPIのURLが何度も登場し、メンテナンス性が低下します。そこで、PowerCMS XのRESTful APIをPHPで素早く・簡単に利用するためのライブラリを書いてみました。

メリット

  • 最小限のコードでAPIを利用できます
  • タスク毎(オブジェクトの取得・更新等)にメソッドを用意しているためURLを自分で考える必要がなくなります
  • 事前に認証情報を設定しておけば、必要に応じて認証を行います
    • 1度認証すれば有効期限までトークンを保持するので認証回数が減ります(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が出力されオブジェクトは承認待ちになる
];

画面キャプチャ:インテリセンス機能によりObjectStatusの値が列挙された様子

まとめ

サイト間連係(複数のPowerCMS Xでデータを連係する)や基幹システムのデータインポートをRESTful APIで行う場合に、本記事の内容が参考になれば幸いです。なお、JavaScriptの場合はRESTful API JavaScript SDKがありますので、あわせてご利用ください。

(2024/4/2追記) バイナリデータのData URIスキーム変換

画像や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);

カテゴリー:技術情報

投稿者:安倍

ブログ内検索

アーカイブ