4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SESAME3 Web APIの開閉操作をPHPで実装してみた

Posted at

candyhouse公式のドキュメントではPHPでの実装方法が見つからなくて色々苦心したので記事にまとめてみました

使用環境
PHP 7.3.22

使用ライブラリ
cryptlib/cmac dev-master(2021/09/11時点)

#手順
まずはAPI使用に必要な情報をSESAMEのシェア用QR(オーナー権限)から取得
公式だと手順が面倒くさかったけれど、便利なツールがあったのでこれを使用

使うのは以下の項目

  • UUID
  • Secret Key

次に、SESAMEのデベロッパーサイトにログインしてAPI_KEYを取得

実装

AES-CMAC をPHPで実装してある記事が見つからなかったので、試行錯誤の結果です
基本的には公式ドキュメントのJSとPythonの実装を足して、PHPのライブラリの仕様に沿わせた感じです

use CryptLib\MAC\Implementation\CMAC;
define('SCRET_KEY', '****')
define('API_KEY', '****')
define('UUID', '****')

// 履歴に残る名前。半角しか使えないらしい
$history = base64_encode('WEB API');
// 操作コマンド
$cmd = 88; // toggle:88/lock:82/unlock:83
$hasher = new CMAC();
$key = hex2bin(SECRET_KEY);
$time = strtotime(date("Y/m/d H:i:s"));

// big endianでバイナリ化されていたので、反転してlittle endianに変換
$msg = substr(strrev(hex2bin(dechex($time))), 1);
$sign = bin2hex($hasher->generate($msg, $key));
$data = compact('cmd', 'history', 'sign'));

$url = "https://app.candyhouse.co/api/sesame2/" . UUID . "/cmd";
$method = 'POST';
$header = [
    "Content-Type: application/json",
    "x-api-key: " . API_KEY
];
$content = json_encode($data);
$options = [
    'http' => compact('method', 'header', 'content')
];
echo file_get_contents($url, false, stream_context_create($options));

備忘録として書いたのでわかりずらいところもあるかと思いますが、誰かの参考になれば。。
CMACのところとか、もっといい書き方やご指摘、不明点などあればコメントください!!

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?