Node.js
milkcocoa
node-red
Node-REDDay 22

API Keyを使えるセキュアなMilkcocoaノード

More than 3 years have passed since last update.

MilkcocoaはIoTデバイス・スマートフォン・PC間で簡単にリアルタイムなデータのやり取りが出来るプラットフォームです。

MQTTにも対応しているので @ohisama@github さんがnode-red用websocketブリッヂ その2 で書いていただいたようにMQTTノードでも利用できます。

ただ、特定のデバイスやクライアントからしかメッセージングできないセキュアな設定をするためには Milkcocoaの認証について(2015年11月バージョン) に対応しなければいけません。

この中でNode-REDとして対応しやすかったAPI Key認証に対応したノードを node-red-contrib-milkcocoa として公開しました。


Milkcocoa Outputノード

Milkcocoaにデータを送信できます。


アカウントの設定

まずは、ノードを配置してMilkcocoaノードをダブルクリックして設定ダイアログを開き、以下の画像の赤丸で囲ったアイコンをクリックしてアカウントを登録します。

スクリーンショット 2015-12-21 15.40.13.png

以下のようにMilkcocoaのApp ID, API Key, API Secretを登録します。API Key, API Secretは任意です。入力しなければ認証なしでのアクセスとなります。

スクリーンショット 2015-12-21 17.30.22.png

MilkcocoaのApp IDは以下にあります。

スクリーンショット 2015-12-21 15.53.40.png

MIlkcocoaのAPI Key, API Secretは以下で設定します。

スクリーンショット 2015-12-21 15.57.48.png


データストアの指定

対象とするMilkcocoaのデータストアを指定します。

スクリーンショット 2015-12-21 16.03.13.png

Milkcocoaの既存データストアは以下です。ここにないデータストア名を指定した場合は最初のデータを投入したタイミングでデータストアが作成されます。

スクリーンショット 2015-12-21 16.12.29.png

最後に指定したデータストアのセキュリティルールをMilkcocoaで設定します。messageデータストアのすべてのオペレーションにAPI Key認証を適用するには以下のような設定になります。

スクリーンショット 2015-12-21 17.12.18.png

message {

permit: all;
rule : account.key == 'API_Key';
}


オペレーションを選択

Milkcocoa Outputノードが受け取るデータをどうするか選択できます。

スクリーンショット 2015-12-21 16.27.57.png

各オペレーションの意味は以下です。


  • push: データストアに新しくデータを追加します。

  • send: データストアにデータを残さず、現在接続されているユーザーにデータを送信* することができます。

  • set: データストアの要素を変更します。

  • remove: データストアからデータを削除します。


データ投入

とりあえずデータを投入するには以下のようにInjectノードにJSON文字列を指定します。

スクリーンショット 2015-12-21 16.38.47.png

InjectノードのボタンをクリックしてDebugノードが以下のようなデバッグを出力すれば問題なくデータが投入されています。Milkcocoaの管理画面でも確認してみましょう。

スクリーンショット 2015-12-21 16.50.01.png


Milkcocoa Inputノード

Milkcocoaのデータストアを監視します。オペレーションの意味は以下です。


  • push: データストアのpushイベントを監視します。

  • send: データストアのsendイベントを監視します。

  • set: データストアのsetイベントを監視します。

  • remove: データストアのremoveイベントを監視します。

以下のようにpushを監視する設定してDebugに表示されればOKです。

スクリーンショット 2015-12-21 17.03.12.png


まとめ

上記で作成したMilkcocoaノードを使ったフローは以下です。

[{

"id": "cdd872f2.32279",
"type": "milkcocoa",
"appId": ""
}, {
"id": "a1abe025.5e542",
"type": "inject",
"name": "",
"topic": "",
"payload": "{\"test\":123}",
"payloadType": "string",
"repeat": "",
"crontab": "",
"once": false,
"x": 123,
"y": 57,
"z": "d152eab6.2ead18",
"wires": [
["73104393.8cefbc"]
]
}, {
"id": "73104393.8cefbc",
"type": "milkcocoa out",
"milkcocoa": "cdd872f2.32279",
"dataStore": "message",
"operation": "push",
"targetId": "",
"name": "",
"x": 306,
"y": 57,
"z": "d152eab6.2ead18",
"wires": [
["fd5ae5bc.02a518"]
]
}, {
"id": "fd5ae5bc.02a518",
"type": "debug",
"name": "",
"active": true,
"console": "false",
"complete": "false",
"x": 500,
"y": 59,
"z": "d152eab6.2ead18",
"wires": []
}, {
"id": "b9dedb60.462128",
"type": "milkcocoa in",
"milkcocoa": "cdd872f2.32279",
"dataStore": "message",
"operation": "push",
"name": "",
"x": 202,
"y": 130,
"z": "d152eab6.2ead18",
"wires": [
["fd5ae5bc.02a518"]
]
}]


おまけ:セキュリティルール

Milkcocoaでは前述したセキュリティルールでデータアクセス権限を柔軟に操作できます。

たとえばIoTデバイスからはAPI Key認証でデータを投入して、Web画面では不特定多数(誰でも)グラフを見れるような設定をする場合は以下のようになります。

'データストア名' {

permit : query, on(push);
rule : true;
}
'データストア名' {
permit : push;
rule : account.key == 'デバイスのAPI_Key';
}

詳しくはMilkcocoaのセキュリティルールについてドキュメントをご覧ください。