concrete5 8.5.0でREST API がサポートされたので試してみた

2019.03.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

世の中のいろんな製品やサービスがAPIに対応していっておりますが、最近ではCMSもAPI対応のものがいくつかあり、concrete5もサポートを開始したようです。 ただし、まだ初期段階のようですので、コールできるAPIは限られておりますが。

ちなみにまだ公式ドキュメントには使い方の記載がないので、ソースコードを見て調べた結果になります。

前提

  • concrete5 バージョン 5.8.5.0がインストールされていること

APIを有効にする方法

ダッシュボート画面のメニューシステムと設定を選択します。 画面上のAPI設定を選択します。

APIを有効化にチェックをつけて、保存ボタンを押します。

下記のように「API設定が更新されました」と表示されるので、有効化された認可タイプのうち、有効にするものにチェックをつけて保存ボタンを押します。今回は試しにAPIをコールしてみるだけなので、全部チェックをつけておきます(この後の例で使うのはクライアント資格情報だけですが)。

下記のように「API設定が更新されました」と表示されるので、インテグレーションを追加ボタンを押します。

今回はclient credentials(クライアント資格情報)認証フローでAPIをコールするので、リダイレクト欄は空欄にして、名前だけ入力してインテグレーションを追加ボタンを押します。

下記のように「インテグレーションが保存されました」と表示されるので、クライアントIDクライアント秘密鍵を控えておきます。クライアント秘密鍵はここで控えておかないと二度と確認することはできませんので、注意です。

APIをコールしてみる

アクセストークンの取得

下記にアクセスしてアクセストークンを取得します。

今回はclient credentials(クライアント資格情報)認可フローでAPIをコールするので、grant_typeclient_credentialsを指定します。scopeは、とりあえず今現在サポートしているものsystem site account全てを指定しておきます。

curl -X POST \
    --user {クライアントID}:{クライアント秘密鍵} \
    --data-urlencode "grant_type=client_credentials" \
    --data-urlencode "scope=system site account" \
    http://(concrete5をインストールしたサーバードメイン)/(concrete5をインストールしたドキュメントルート)/index.php/oauth/2.0/token | jq

取得結果はこのようになります。

{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6(・・・略・・・)"
}

APIをコールするスクリプト

http通信ができれば何でも良いので、今回は下記のようなスクリプトを用意しました。

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$token = "(取得したアクセストークン)";
try {
    $client = new Client(['base_uri' => "(concrete5をインストールしたサーバードメイン)"]);
    $response = $client->request(
        'GET', 
        "/(concrete5をインストールしたドキュメントルート)/index.php/ccm/api/v1/system/info", 
        [
            'headers' => 
                [
                    'Authorization' => "Bearer " . $token,
                ],
            'http_errors' => false,        
        ]);
    $body = $response->getBody();
    echo $body;
}
catch(\GuzzleHttp\Exception\ClientException $e){
    print($e);
}

/ccm/api/v1/system/infoをコールした結果

このようなシステム関連の情報が返ってきます。

{
  "data": {
    "version": "8.5.0",
    "code_version": "8.5.0",
    "db_version": "20190301133300",
    "packages": "",
    "overrides": controllers/single_page/dashboard, controllers/single_page/top.php, controllers/single_page/test.php, controllers/single_page, single_pages/dashboard, single_pages/top.php, single_pages/test.php",
    "cache": "Block Cache - Off\nOverrides Cache - Off\nFull Page Caching - Off\nFull Page Cache Lifetime - Every 6 hours (default setting).",
    "server": "Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.2.10 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.9 Perl/v5.24.0",
    "server_api": "apache2handler",
    "php_version": "7.2.10",
    "php_extensions": "apache2handler, bcmath, bz2, calendar, Core, ctype, curl, date, dom, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, imap, intl, json, ldap, libxml, mbstring, mysqli, mysqlnd, openssl, pcre, PDO, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, Reflection, session, SimpleXML, soap, sockets, sodium, SPL, sqlite3, standard, tokenizer, wddx, xml, xmlreader, xmlwriter, xsl, Zend OPcache, zip, zlib",
    "php_settings": "max_execution_time - 30\nlog_errors_max_len - 1024\nmax_file_uploads - 20\nmax_input_nesting_level - 64\nmax_input_time - 60\nmax_input_vars - 1000\nmemory_limit - 128M\npost_max_size - 8M\nupload_max_filesize - 32M\nldap.max_links - Unlimited\nmysqli.max_links - Unlimited\nmysqli.max_persistent - Unlimited\npcre.backtrack_limit - 1000000\npcre.recursion_limit - 100000\npgsql.max_links - Unlimited\npgsql.max_persistent - Unlimited\nsession.cache_limiter - <i>no value</i>\nsession.gc_maxlifetime - 7200\nsoap.wsdl_cache_limit - 5\nopcache.max_accelerated_files - 4000\nopcache.max_file_size - 0\nopcache.max_wasted_percentage - 5"
  }
}

/ccm/api/v1/site/treesをコールした結果

サイトに関する情報が返ってきます。

{
  "data": [
    {
      "id": 1,
      "name": "concrete5demo5850",
      "icon": ""
    }
  ]
}

おわりに

サポートが開始されたばかりなので、コンテンツ情報を取得するAPIは整備されてないようです。

今後APIが追加されていくと他サービスと組み合わせたり、今とは違った使い方ができるのではないかと思います。

リンク

concrete5 公式サイト

concrete5 8.5.0 リリースノート