開発情報・ナレッジ

投稿者:SPIRERS ナレッジ向上チーム 2022年8月31日 (水)

APIメソッドごとのサンプルコードまとめ Authentication(認証API)

この記事では Authentication(認証API)のメソッドごとに、サンプルコードをまとめています。
SPIRAL ver.2 でAPIを使用する時の参考になれば幸いです。

APIメソッドごとの権限設定方法まとめ Authentication(認証API)と合わせてご参照ください。

はじめに

この記事で紹介するサンプルコードでは、共通のcurl送信用モジュールを使用しています。
そのため、必ず下記のモジュールを記載するようにしてください。

※共通モジュールなので、APIメソッドを複数回実行する場合でも1回だけ記載すれば大丈夫です。
※APIメソッドを複数回実行する場合は、サンプルコードの「API実行」部分に適宜記述を追加してください。
共通モジュール
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "Content-Type:application/json",
            "X-Spiral-Api-Version: 1.1",
        );
        if(APP_ROLE){
			$header = array_merge($header,array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        return json_decode($response , true);
    }
}

設定値に関して

共通で使用する値に関しては、定数として初めに設定します。
具体的には下記のような値を設定してください。
API_URL リクエスト先URLの固定部分です。固定値ですので特に変更する必要はありません。
API_KEY 発行したAPIキーを設定してださい。別途権限の付与が必要になります。
APP_ROLE アプリロールを指定することはできませんので、値は空で大丈夫です。
SITE_ID API利用する認証エリアがあるサイトのIDを設定してください。
AREA_ID API利用する認証エリアのIDを設定してください。
設定値
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "");
define("SITE_ID", "サイトID");
define("AREA_ID", "認証エリアID"); 
補足
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
上記はAPIキーの記述を「PHP環境変数設定」を利用した場合のコードとなります。
このように定数を設定する時に、ver.2 機能の「PHP環境変数設定」を利用することで、
本番環境とテスト環境でキーが異なっていても、コードを書き換える必要がなく、保守性が高まります。
APIキーなど複数ページで使用するものは、環境変数設定をしておきましょう。

その他詳しくはサポートサイト「PHP環境変数」をご参照ください。

認証エリアログインのサンプルコード

認証エリアログイン(【POST】site/{siteId}/authentications/{authenticationId}/login )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "");
define("SITE_ID", "サイトID");
define("AREA_ID", "認証エリアID"); 

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

// ログインするレコードを指定
$body = array(
    "id" => "IDフィールドの値",
    "password" => "パスワードの値"
);
$resultLogin = $commonBase->apiCurlAction("POST", "/sites/". SITE_ID. "/authentications/". AREA_ID. "/login", $body);

//------------------------------
// 共通モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "Content-Type:application/json",
            "X-Spiral-Api-Version: 1.1",
        );
        if(APP_ROLE){
			$header = array_merge($header,array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        return json_decode($response , true);
    }
}
補足
これ以降のメソッドの「token」はログインメソッドのレスポンスである、エリア認証トークン(token)を利用します。
そのため、まず初めにこのメソッドを実行する必要がありますので、ご注意ください。

またレスポンスでエリア認証トークンの有効期限(expireTime)が返ってきます。
そのままだとエポック秒ですが、下記のコードで日時に変換することができます。
date("Y-m-d h:i:s", $resultLogin["expireTime"]);

エリア認証トークン有効性確認のサンプルコード

エリア認証トークン有効性確認(【POST】site/{siteId}/authentications/{authenticationId}/status )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "");
define("SITE_ID", "サイトID");
define("AREA_ID", "認証エリアID"); 

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$body = array(
    "token" => "認証エリアトークン",
    "extendExpireTime" => "true"
);
$resultStatus = $commonBase->apiCurlAction("POST", "/sites/". SITE_ID. "/authentications/". AREA_ID. "/status", $body);

//------------------------------
// 共通モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "Content-Type:application/json",
            "X-Spiral-Api-Version: 1.1",
        );
        if(APP_ROLE){
			$header = array_merge($header,array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        return json_decode($response , true);
    }
}
補足
このメソッドではエリア認証トークンの有効性を確認することができます。
また「extendExpireTime」を true にすることで、確認と同時にセッションを延長することができます。
「extendExpireTime」は、デフォルトが true になっていますので、セッションを延長しない場合は false を指定ください。

認証エリアログインワンタイムURL発行のサンプルコード

認証エリアログインワンタイムURL発行(【POST】site/{siteId}/authentications/{authenticationId}/oneTimeLogin )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "");
define("SITE_ID", "サイトID");
define("AREA_ID", "認証エリアID"); 

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$body = array(
    "token" => "認証エリアトークン",
    "path" => "発行する認証エリアページパス"
);
$resultOneTimeLogin = $commonBase->apiCurlAction("POST", "/sites/". SITE_ID. "/authentications/". AREA_ID. "/oneTimeLogin", $body);

//------------------------------
// 共通モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "Content-Type:application/json",
            "X-Spiral-Api-Version: 1.1",
        );
        if(APP_ROLE){
			$header = array_merge($header,array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        return json_decode($response , true);
    }
}
補足
ログインする認証エリアのページパス指定方法ですが、
例えば下記の画像の「テストページ」のワンタイムURLを発行したい場合、「path」の値は「/top/test_page」のように相対パスで指定します。 また、「path」にURLパラメータを入れているとAPIエラーとなりますので、
ワンタイムURLにパラメータを付けたい場合は、リクエスト時に付与するのではなく、
発行されたワンタイムURLに後から付与するようにしてください。

認証エリアログアウトのサンプルコード

レコード変更(【PATCH】apps/{app}/dbs/{db}/records )を実行したい場合には下記のサンプルコードを使用してみてください。
サンプルコード
//------------------------------
// 設定値
//------------------------------
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", $SPIRAL->getEnvValue("apikey"));
define("APP_ROLE", "");
define("SITE_ID", "サイトID");
define("AREA_ID", "認証エリアID"); 

//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

$body = array(
    "token" => "認証エリアトークン"
);
$resultLogout = $commonBase->apiCurlAction("POST", "/sites/". SITE_ID. "/authentications/". AREA_ID. "/logout", $body);

//------------------------------
// 共通モジュール
//------------------------------
class CommonBase {
    /**
     * シングルトンインスタンス
     * @var UserManager
     */
    protected static $singleton;

    public function __construct() {
        if (self::$singleton) {
            throw new Exception('must be singleton');
        }
        self::$singleton = $this;
    }
    /**
     * シングルトンインスタンスを返す
     * @return UserManager
     */
    public static function getInstance() {
        if (!self::$singleton) {
            return new CommonBase();
        } else {
            return self::$singleton;
        }
    }
    /**
     * V2用 API送信ロジック
     * @return Result
     */
    function apiCurlAction($method, $addUrlPass, $data = null) {
        $header = array(
            "Authorization:Bearer ". API_KEY,
            "Content-Type:application/json",
            "X-Spiral-Api-Version: 1.1",
        );
        if(APP_ROLE){
			$header = array_merge($header,array("X-Spiral-App-Role: ".APP_ROLE));
		}
        // curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL. $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        if ($method == "POST") {
            curl_setopt($curl, CURLOPT_POSTFIELDS , json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "PATCH") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        if ($method == "DELETE") {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);
        return json_decode($response , true);
    }
}
補足
「token」はAPIログインした時のレスポンスである認証エリアトークンを指定する必要があります。
そのため、ログアウトメソッドはAPIでログインした場合でしか利用できません。
ログインフォームから通常通りログインして、APIでログアウトといった処理はできませんのでご注意ください。

ver.2 でPHPの実行結果を確認する方法

ver.2 では echo などの関数が使えないため、実行結果を確認するためには Thymeleaf を使用する必要があります。
はじめは分かりにくい部分ではありますので、初歩的な確認方法を以下で解説いたします。

1)ソース設定でフリーコンテンツブロックを作成して以下の Thymeleaf を記載してください。
<div>
    <div th:if="${cp.result.isSuccess}">
        <div th:text="${cp.result.value['API_RESPONSE']}"></div>
    </div>
    <div th:if="${!cp.result.isSuccess}">
        <div th:text="${cp.result.errorMessage}"></div>
    </div>
</div>
2)作成したブロックをページに追加してください。
3)ページの「PHP」タブにコードを記載し、コード内で実行結果を Thymeleaf に渡す記載をしてください。
例:APIで認証エリアにログインしたレスポンスを確認したい場合
//------------------------------
// API実行
//------------------------------
$commonBase = CommonBase::getInstance();

// ログインするレコードを指定
$body = array(
    "id" => "IDフィールドの値",
    "password" => "パスワードの値"
);
$resultLogin = $commonBase->apiCurlAction("POST", "/sites/". SITE_ID. "/authentications/". AREA_ID. "/login", $body);

// レスポンスを Thymeleaf に受け渡す
$SPIRAL->setTHValue("API_RESPONSE", $resultLogin);
上記ページを作成することで、ページURLを開くと実行結果を確認することができます。
ver.2 でPHPのデバッグをしたい場合などに活用してみてください。
コンテンツに関しての
要望はこちら