マネーフォワード クラウド請求書APIのアクセストークン期限について
はじめに
以前、マネーフォワード クラウド請求書APIをPowerShellで実行する記事を書きました。
APIを実行するのに必要なアクセストークンは30日限定です。
そのため定期的に再発行する必要があります。
じゃぁ、いつ切れるのかというと、不親切な事にすんなりいつなのかという事は教えてくれません。。。
以下のようにアクセストークン発行時のコマンドの結果に情報が入ってはいますが。。。
<リード権限アクセストークン発行時の出力>
access_token : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
token_type : bearer
expires_in : 2592000
refresh_token : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
scope : read
created_at : 1566500840
「created_at」が作成日時で「expires_in」が期限切れ日時って事だと思うのですが、いったいこの数値をどうしろと?
と、いう事で、この記事はアクセストークンの期限についての記事です。
この数値は何か?
マネーフォワードのAPIの説明ページやGitのReadmeにも説明が無かったので、サポートに問い合わせた所、以下の返答が。
担当部署に確認いたしましたところ、created_at に出力されている数値は UTCでの1970年1月1日 午前0時0分0秒から形式的な経過秒数(UNIX時間)となります。
例えば、created_at : 1566500840 は、2019-08-23 04:07:20 +0900 を指します。
また、expires_in に出力されている数値は単に秒数です。
2592000 / 3600 / 24 = 30 日(アクセストークンの有効期限30日のこと)以上から、created_at と expires_in に出力された数値を足し合わせたものを日時に変換すればいいと考えられます。
ほう。何となく雰囲気は感じてましたが。Unixタイムってやつですね。
さっそく変換してみる
Linuxだとdateコマンドで変換が出来た気がしますが、私はPowerShell使いなので、PowerShellでやってみます。とりあえず何も考えずget-dateに食わせてみます。
work># created_at
work>Get-Date 1566500840
0001年1月1日 0:02:36
work>
想定された出力ではないので、違うようです。
さすがに乱暴だったので調べました。
Get-Dateは.NetFrameworkのDateTIme型のデータとして入力を扱います。
で、西暦1年1月1日 00:00:00から西暦9999年12月31日までの範囲を表現するようです。
そしてUNIXタイムですが。回答にもある通り、1970年1月1日00:00:00からの経過秒数です。
そのまま食わせてもスタート地点が違うので上記のように変な出力になるんですね。
また、DateTIme型の入力はナノ秒として扱うようで。
ちょっと処理を咬ませないといけないようです。
work>$epoc = New-Object System.DateTime 1970,1,1
work>$epoc.AddSeconds(1566500840)
2019年8月22日 19:07:20
work>
1970/1/1で初期化したDateTimeオブジェクトを作って、UTCタイムの秒数を加算する。
これでいけます。
つまり、以下のように、作成日時+「expires_in」にすると期限がいつか分かります。
work> $epoc = New-Object System.DateTime 1970,1,1
$created_at = $epoc.AddSeconds(1566500840)
$expires_in = $created_at.AddSeconds(2592000)
$expires_in
2019年9月21日 19:07:20
work>
関数化すると以下のような感じです。
Function Get-AccessTokenExpires {
param($created_at, $expires_in)
$epoc = New-Object System.DateTime 1970,1,1
$dt_created_at = $epoc.AddSeconds($created_at)
$dt_expires_in = $dt_created_at.AddSeconds($expires_in)
$dt_expires_in
}
使用方法は以下。
work> Get-AccessTokenExpires -created_at 1566500840 -expires_in 2592000
2019年9月21日 19:07:20
work>
まとめ
クラウド請求書APIは結構使えると思うので、上記の期限の情報は知ってて損は無いかと。
ちなみにPowerShellだとちょっと処理が必要ですが、Linux のdateコマンドだと一発で変換できます。
まぁ、Unixタイムの扱いなので、当たり前ですが。
minoru@cjaapl01:~$ date -d @1566500840
Thu Aug 22 19:07:20 UTC 2019
minoru@cjaapl01:~$