micro:bitからBasic認証を通す
Wi-Fi通信モジュール(ESP8285)とアンテナを搭載したGroveデバイス「UART WiFi V2 (ESP8285)」を使って、micro:bitからWebサーバーの基本的なアクセス制限の一つであるBasic認証を通す方法を紹介します。
1.UART WiFi V2 (ESP8285)
seeedのUART WiFi V2 (ESP8285)は、Wi-Fi通信モジュール(ESP8285)とアンテナを搭載したGroveデバイスです。UART WiFi V2の機能について「15-3.UART WiFi V2 (ESP8285)」で詳しく紹介していますのでご覧ください。
2.BASIC認証を通す準備
Webサーバーへのアクセス
Webサーバーへのアクセスは完了しているものとします。micro:bitからWebサーバーへのアクセスは「15-5.micro:bitからWebサーバーへアクセスする」を参考にしてください。
3.Basic認証を通す
ブラウザーによるアクセス
Basic認証は、Webサーバーのディレクトリーやファイルに、アクセス制限をかけることができる基本的な認証方法の一つです。ブラウザーから、Basic認証でアクセス制限されたディレクトリーやファイルにアクセスしようとすると、ユーザー名とパスワードの入力を促す認証ダイアログが表示されます。
下の図は、ブラウザー(Firefox)から、Basic認証でアクセス制限された「http://sanuki-tech.net/wifi-test/basic-auth/」へアクセスして、認証ダイアログが表示されたようすです。
認証ダイアログで、ユーザー名とパスワードの正しい組み合わせが入力できないとエラー(401 Unauthorized)となり、下の図のようなメッセージが表示されます。
ユーザー名とパスワードの正しい組み合わせを入力すると、情報(このURLの場合は「auth ok」と言う文字)が表示されます。
Basic認証時のHTTPリクエストとHTTPレスポンス
Basic認証でアクセス制限されたディレクトリーやファイルにアクセスすると、WebサーバーからWWW-Authenticateヘッダーを含むHTTPレスポンスが返ります。
WWW-Authenticateヘッダーは、ディレクトリーやファイルへのアクセス権を取得するために使われる認証方式を、ブラウザーへ通知するものです。Basic認証の場合「Basic」がセットされています。このHTTPレスポンスを受け取ることで、ブラウザーはBasic認証が必要であると判断して、認証ダイアログを表示します。
認証ダイアログに、ユーザー名とパスワードが入力されると、それらの値をコロン(:)で連結してBase64で符号化した文字列を、Authorizationヘッダーに含めて、HTTPリクエストとしてWebサーバーへ送ります。
「VXNlcjpQYXNzd29yZA==」が、ユーザー名とパスワードをコロン(:)で連結したもの(この例では「User:Password」)を、Base64で符号化した文字列です。
Authorizationヘッダーを含むHTTPリクエストを受け取ったWebサーバーは、ユーザー名とパスワードの組み合わせが、登録されているものと一致する場合、そのディレクトリーやファイルにアクセスできるアクセス権を与えます。
このように、Basic認証でアクセス権を取得するには、WWW-Authenticateヘッダーを含むHTTPレスポンスとAuthorizationヘッダーを含むHTTPリクエストによるやり取りが行われていることがわかりました。では、micro:bitからBasic認証によるアクセス権を取得するにはどうすればいいのでしょうか?
micro:bitからBasic認証を通すには?
前述のように、WWW-Authenticateヘッダーを含むHTTPレスポンスを受け取ったら、Authorizationヘッダーを含むHTTPリクエストを返すようにプログラミングすることで、Basic認証によるアクセス権を取得できそうです。が、ちょっと面倒ですね。
実は、あらかじめアクセスするディレクトリーやファイルに対して、Basic認証によるアクセス権が必要であるとわかっている場合は、HTTPリクエストにAuthorizationヘッダーを含めることで、アクセス権を取得することができます。
では、Basic認証が必要なURL(この例では「http://sanuki-tech.net/wifi-test/basic-auth/」)にアクセスするときのHTTPリクエストを考えてみましょう。表3-3は「15-5.micro:bitからWebサーバーへアクセスする」で解説したHTTPリクエスト(GETメソッド)です。これに、Authorizationヘッダーを含めて、Basic認証のアクセス権を取得できるようにしたのが表3-4です。
1行目がリクエストラインで、ここにBasic認証が必要なパス(/wifi-test/basic-auth/)を記述します。5行目がAuthorizationヘッダーで、ここに認証のタイプがBasic認証(Basic)であること、およびBasic認証に必要な資格情報(VXNlcjpQYXNzd29yZA==)を記述します。この資格情報は、ユーザー名とパスワードをコロン(:)で連結したもの(この例では「User:Password」)を、Base64で符号化した文字列です。「Base64 符号化」などで検索して見つかる変換サービスを利用して、あらかじめ文字列を作成しておきます。
4.プログラム(ブロック)
初期設定後、ボタンAを押したときに、Wi-Fiアクセスポイントに接続後、Webサーバーへアクセスするプログラムです。アクセスには、Basic認証によるアクセス権が必要です。正常に接続できた場合、Webサーバーから返信されたHTTPレスポンスの内容をLED画面に表示します。「15-5.micro:bitからWebサーバーへアクセスする」との差分のみ解説します。
最初だけ実行するプログラム
初期設定です。Basic認証に必要な変数「Credentials」を定義しています。
関数:SendATCommandWaitResponse
変更はありません。
ボタンAが押されたときに実行するプログラム
WebサーバーへアクセスするためのHTTPリクエストに「Authorizationヘッダー」を追加しました。
5.プログラム(JavaScript)
プログラム(JavaScript)です。
6.動作確認
micro:bitにプログラムを書き込んだ後、USBケーブルをGrove Shield for micro:bit v2.0側のMicro USB端子に接続します。この端子から電源供給しないと正常に動作しませんでした。LED画面にハートが表示されたことを確認して、ボタンAを押します。うれしい顔が表示された後、HTTPレスポンスの内容が表示されると成功です。
表6-2は、Webサーバーのアクセスログです。GETメソッドにより、 /wifi-test/basic-auth/へアクセスしているようすが記録されています。リクエストの処理結果は「200 OK」、UserAgentは「micro:bit」です。