APIを呼び出す時に利用するISO 8601フォーマットの日付文字列
AWS APIをコールするとき
こんばんは、よくジョナサンにピットインしているあかりです。今回は、AWSのAPIを呼び出すときに利用するISO 8601形式の日付文字列の作成方法についてご紹介します。
ISO 8601形式
ISO 8601はコンピュータにおける情報交換のための日付と時刻の表現方法について定めた国際規格です。協定世界時 (UTC)の場合、サフィックス 'Z' を付加します。地方時の場合は、+09:00のように付加します。
JavaScriptで作成する
JavaScriptを使ってISO 8601形式の文字列を作成するとき、何気に汎用的な作り方が見つかりません。そこで、以下の様な関数を書いて作成します。
function ISODateString(d){ function pad(n){return n<10 ? '0'+n : n} return d.getUTCFullYear()+'-' + pad(d.getUTCMonth()+1)+'-' + pad(d.getUTCDate())+'T' + pad(d.getUTCHours())+':' + pad(d.getUTCMinutes())+':' + pad(d.getUTCSeconds())+'Z' } function getTimeStamp(){ var d = new Date(); var now = ISODateString(d); console.log(now); } getTimeStamp() 2014-08-28T23:25:47Z
また、公開されているライブラリを使うのもありですね。
bashで作成する
bashコマンドでISO 8601形式の文字列を作成するsnippetです。
$ (date -u +%Y-%m-%dT%H:%M:%SZ) 2014-08-28T23:25:47Z
Pythonで作成する
Pythonを使ってAPI接続の検証コードを書く時にISO 8601形式をサクッと作成したいですよね。
import datetime datetime.datetime.utcnow().isoformat()+'Z' '2014-08-28T14:33:47.002135Z'
API認証するステップ
ISO 8601形式の文字列を使ってAPI認証するステップをご紹介します。
import hmac import base64 import hashlib url = "/api" host = "http://hoge.com" from datetime import datetime timestamp = datetime.datetime.utcnow().isoformat()+'Z' api_secret = "WWWWWWWWWWWWWWWWWWWWWWWWWWW" canonical = "{}:{}:{}".format(url, host, timestamp) print canonical sig_hmac = hmac.new(api_secret, canonical, digestmod=hashlib.sha256) b64_hmac = base64.encodestring(sig_hmac.digest()).strip() print timestamp print b64_hmac
ここで得た文字列を使って得たSignatureをAPIリクエスト時に用いています。
$ curl -v -d "api_key=XXXXXXXXXXXXXXXXXXXX" \ > -d "api_signature=YYYYYYYYYYYYYYYYYYYYYYY" \ > -d "api_timestamp=2014-08-27T22:19:20Z" \ > http://hoge.com/api
まとめ
AWS APIに限らず、公開されているAPIを呼び出す際、多くの場合ISO 8601形式の日付文字列を使って、Signatureを取得します。1回やり方をおぼえてしまえば、他のAPIにアクセスする際も同じようにできますね!