APIを呼び出す時に利用するISO 8601フォーマットの日付文字列

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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にアクセスする際も同じようにできますね!

参考資料

Get an ISO 8601 Formatted Date in Javascript

Date and Time API 徹底攻略(3) - ISO 8601