1.はじめに
Google AssistantからアクセスできるAPIを作成して、ローカルで音楽再生をさせたりしているのですが、だいたい翌日にはステータスを拾えなくなっています。再リンクを行えば回復はするのですが、ちょっと使いづらいのは確かです。そういう風にステータスを拾えなくなるサービスは他にもあるのでそういうものなのかと思わなくもありませんでしたが、HTTPサーバーのログを見ると、トークン制御のアクセスで400が出ています。
OAuth2ってそういうものでしたっけ。
2.リフレッシュトークンでリフレッシュさせたい
もちろん違って、アクセストークンの期限が切れたらより期限の長いリフレッシュトークンを使ってアクセストークンを取り直すことができるはずです。念のため、topen.phpへPOSTされたデータを確認するとトークンリフレッシュが要求されています。
grant_type=refresh_token&refresh_token=dff5……bd37&client_id=googleclient&client_secret=secret
ただ、ログを取ると400(Bad Request)を返しているので改めてOAuth2 Server PHPのGrant TypesにあるRefresh Tokenを読んでみると、OAuth2サーバーを簡単に構築するcookbookではリフレッシュトークンを使った許可延期の処理は組み込まれていないのでした。
リフレッシュトークンを使った許可処理を組み込むにはcookbookで作成したserver.php
にrefresh_token許可のメソッドを追加します。
$server->addGrantType(new OAuth2\GrantType\RefreshToken($storage, array(
'always_issue_new_refresh_token' => true,
'unset_refresh_token_after_use' => true,
'refresh_token_lifetime' => 1209600,
)));
GrantType\RefreshToken()
は3つのオプションを持っています。
-
always_issue_new_refresh_token
リフレッシュトークンが使われるとリフレッシュトークンを新規発行する(デフォルト:false) -
unset_refresh_token_after_use
使われたリフレッシュトークンを取り消す(デフォルト:true) -
refresh_token_lifetime
リフレッシュトークンの寿命(デフォルト:1209600(2週間))
試行錯誤はしましたが、always_issue_new_refresh_token
をtrue
にするのが良いようです。デフォルトのままだと、リフレッシュ処理が1回行われてaccess_tokenが発行されますが、使われたリフレッシュトークンは削除されて二度目のリフレッシュができなくなりました。(なんか微妙な動きという気はします)
3.動作確認
動作確認するためにはリフレッシュトークンが使われなければなりません。一旦リンクを取り直すと1時間有効のアクセストークンが出されるので、1時間待ってアクセストークンの有効期限が切れるのを待ちます。1時間経ってgoogle Assistantを再読み込みさせてアクセスログにtoken.phpへのアクセスがが200であればOK。念のためさらに1時間待って再度リフレッシュトークンが発行されるかどうかを確認します。
トークンの発行状況ですが、oauth2用に作成したテーブルを確認するのが容易なようです。
- アクセストークンの一覧
select * from oatuh_access_tokens order by expires;
- リフレッシュトークンの一覧
select * from oatuh_refresh_tokens order by expires;
oauth_access_tokensに1時間有効のトークンが登録され、oauth_refrsh_tokenに2週間有効なトークンが登録されていればOKです。特にoauth_refresh_tokensについては、リンクを取り直した時に発行された(最新のものより有効期限が1時間短い)トークンが無いことを確認します。oauth_refresh_tokensについては、動作確認の前後で内容を確認すると良いと思います。
4.おわりに
リフレッシュトークンが使えるようになり、goolge Assistantで気が付いたらステータスを拾えなくなっているようなこともなくなりました。それはそれとしてoauth_access_tokensにしろ、oauth_refresh_tokensにしろ、今のところトークンが溜まっていく一方です。古いトークンが残っていても期限は切れているので害はないと思いますが、いらない情報でリソースが消費されていくのもどうかという気がします。
ところでモックアップとして作成していた疑似スマートデバイスですが、現在は音楽再生のデバイスのような振る舞いもできるようになっています。
OAuth2関連DBの整理や疑似スマートデバイスの拡張については、また稿を改めたいと思います。