Android AccountManagerのgetAuthTokenはキャッシュされる?
ふと思って
そういや、AccountManager.getAuthTokenで返されるトークンってキャッシュされなかったっけ?
— kinjouj (@kinjou_j) June 7, 2013
って書いちゃったので調べた
http://d.hatena.ne.jp/adsaria/20101012/1286886888 に書かれている通り、一定期間で持ってアクセストークンは有効期限切れで失効するような場合だといくらgetAuthTokenを実行してもキャッシュされているアクセストークンを取ってくる。つまりサーバー側にアクセストークンをくれと要求する事が無い模様。まぁ端末内にどれくらいの期間アクセストークンをキャッシュするのかは要調査。フロー的には
- getAuthTokenを最初に呼び出した際にサーバーからアクセストークンを取得 (この時点でキャッシュされる?)
- APIコールしたりとか(ry
- 再度getAuthTokenで取得する (この際にはサーバーへリクエスト送信されずキャッシュされたのが返される?)
- APIコールする。この際アクセストークンが失効しているとエラーになる
っていう感じじゃないかと。で上記参考先にも書いてあるけど、失効しているアクセストークンをキャッシュから取り除くにはAccountManager#invalidateAuthTokenメソッドを使ってキャッシュから取り除く必要がある。例えば、一定のインターバルを過ぎた場合にはAccountManagerのgetAuthTokenを実行する処理のfinally辺りでAccountManager.invlaidateAuthToken実行するとか
追記
doorkeeperのaccess_token_expires_inで有効期限を小さくして、以下のような検証してみた
- AccountManager.invalidateAuthTokenをしない場合: 初回時にアクセストークンを取得。AccountManagerによりキャッシュされる。その後サーバー側でアクセストークンが破棄されるまで放置し、有効期限切れになるとそこ後はアクセストークンがキャッシュされているのしか出ないのでWeb API通信が失敗する
- AccountManager.invalidateAuthTokenをした場合、上記同様だが、アクセストークンは通信される際に毎回取得するのでクライアント側で以前に使ったアクセストークンなどは使用されず、新しくアクセストークンを取り直す。但し、有効期限で執行しない限りはアクセストークンは変わらない。執行すると新しいアクセストークンが取得できる。とりあえずは通信は失敗しない
というような感じ。インターバルとかで(クライアント側)キャッシュを破棄されるような仕組みっていうは時と場合によっては同期が無効になってたりすると不整合を招く恐れがあるので、通信自体の間隔を大きくして低減させる方が望ましいのかも