Node-REDのhttp inノードでBasic認証を有効にする

BluemixのNode-REDのhttp inノードで作成するWebアプリケーションをBasic認証で保護する。
bluemix-settings.jsとpackage.jsonをカスタマイズして、ユーザーID／パスワードを定義する。
フローエディタもユーザーID／パスワードで保護できる。この場合はNode.jsランタイムの環境変数をカスタマイズする。

参照：
https://nodered.jp/docs/configuration.html
http://nodered.org/docs/security#http-node-security
http://nodered.org/docs/security#generating-the-password-hash
https://console.ng.bluemix.net/docs/starters/IoT/iot500.html

##手順

1. IoTスターターを作成し、Gitリポジトリを追加する
2. bluemix-settings.jsにhttpNodeAuthの設定を追加する<br>
2-1. パスワードをbcryptjsでハッシュ化する方法<br>
2-2. パスワードをMD5でハッシュ化する方法（現在は非推奨）<br>
3. （おまけ）フローエディタを保護する

##1. IoT Starterを作成し、Gitリポジトリを追加する
以下の記事に記述しましたので、ここでは省略します。
[Node-REDのfunctionでVCAP_SERVICESを取得する](http://qiita.com/takeyan/items/6a98027a67bc939337d4)

##2. bluemix-settings.jsにhttpNodeAuthの設定を追加する

###2-1. パスワードをbcryptjsでハッシュ化する方法
bluemix-setting.jsに以下の要領でhttpNodeAuthの設定を追加し、Basic認証で使用するユーザーIDとパスワードを定義します（以下の例ではユーザーID=takeyan,パスワード=passwordと定義）。

```js:bluemix-settings.js
var bcrypt = require("bcryptjs");
（中略）
var settings = module.exports = {
（中略）
httpNodeAuth: { user:"takeyan", pass: bcrypt.hashSync('password')},
（中略）
}
```
![bluemix-settings-bcryptjs.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/f3b5e2d0-4b57-3b0b-c304-75f683fbdead.jpeg)

さらに、package.jsonのdependenciesにbcryptjsを追加します。

```json:package.json
"dependencies" {
（中略）
  "bcryptjs" : "2.x",
```
![package-json.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/e6220c02-5eee-3e06-7858-dbad33dbb83f.jpeg)

エディタの使い方、設定ファイル編集後の反映方法もこちらの記事を参考にして下さい。
[Node-REDのfunctionでVCAP_SERVICESを取得する](http://qiita.com/takeyan/items/6a98027a67bc939337d4)

ランタイムが再起動したら、確認のため簡単なWebアプリフローを作成して呼び出してみます。
フローエディタを呼び出すため、まずランタイムのURLをブラウザで呼び出したところ、いきなりユーザーID／パスワードの入力を要求されました。これには意表を突かれましたが、httpNodeAuthはhttp inノードの保護というよりも、Node-REDへのhttp(s)アクセスの保護ということなのでしょう。
![challenge-md5.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/0fe50795-5a39-162f-b737-53015415018f.jpeg)

bluemix-settings.jsで設定したユーザーID／パスワードを入力して無事ログインし、フローエディタを開いて、簡単なWebアプリを作成します。
![flow-editor.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/935cf633-87d1-3caa-6ecd-eb5c2167974e.jpeg)

ユーザーID／パスワードが要求されることを確認するため、ブラウザの履歴を消去しておきます。（以下はFireFoxの履歴消去の例）
![history.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/10dea095-4ad1-6020-9b83-14e0a7c25130.jpeg)

先ほど作成したWebアプリを呼び出すと、ユーザーID／パスワードの入力を要求してきました。
![hello-challenge.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/4b24c33e-2eeb-bc0d-bf70-86b505cd67c4.jpeg)

ユーザーID／パスワードを入力して、無事Webアプリにアクセスできました。
![helloworld.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/e89cd433-7a1f-4277-18e7-29ad518f28d9.jpeg)



###2-2. パスワードをMD5でハッシュ化する方法（現在は非推奨）
bluemix-setting.jsに以下の要領でhttpNodeAuthの設定を追加し、Basic認証で使用するユーザーIDとパスワードを定義します。

```js:bluemix-settings.js
var crypto = require("crypto");
（中略）
var settings = module.exports = {
（中略）
httpNodeAuth: { user:"takeyan",
pass: crypto.createHash('md5').update('password','utf8').digest('hex') },
（中略）
}
```
![bluemix-settings_md5.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/022ec483-e76b-8494-4a28-f57783807d93.jpeg)

package.jsonのカスタマイズは不要です。他はbcryptjsのケースと同様です。


##3. （おまけ）フローエディタを保護する
以下リンク先のオンラインマニュアルの一番最後の「フロー・エディターの保護」の項で手順を紹介しています。
[モノのインターネット・スターター・アプリケーションによるアプリの作成](https://console.ng.bluemix.net/docs/starters/IoT/iot500.html)

ユーザー定義環境変数にユーザーID／パスワードを設定する例と、設定の結果現れるようになったフローエディタの認証画面を以下にご紹介します。
![environment_variable.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/eda3924d-02fa-d9d1-9268-3657a1a36ad5.jpeg)

![Node-RED-Challenge.jpg](https://qiita-image-store.s3.amazonaws.com/0/32083/3b352dae-24c1-12b4-8ac8-bc22ad53a3e2.jpeg)

以上です。