Fustion Tables へのアクセスがうまくいかず結構悩んだ

id:yellow_73:20110809#p2 のつづきです。

unauthenticated が出まくる

まず、昨日まで SHOW TABLES がうまくいってたのに、突然うまくいかなくなりました。
unauthenticated という文言が見え、HTTP応答ステータスは 401 でした。
他のクエリではどうだろう、と思い、SELECT * FROM [id] をリクエストしましたが、これはうまくいきました。
つまり、特定のクエリだけがうまくいかない。これには正直悩みました。
で、ふと気づいた。Fusion Tables ではパブリックなテーブルが作れる、これを引っ張ってきてるのではなかいと。さきほどの SELECT の対象テーブルは、プライベートなものではありませんでした。これは単に認証トークンを見てないので成功しているのではないか、と。
今度は、プライベートなものを見に行こうとしたら、見事に unauthenticated とされました。
ここまでくれば私でも分かる、認証トークンが賞味期限切れになってたんだ、と。

認証トークンが適切でアカウントに権限が無いコマンドの場合は unauthenticated でない

プライベートなテーブルを権限の無いアカウントから見ようとすると、同じ 401 を返されるのですが、ボディには "User does not have permission to view the underlying data" という文言が出ます。

考えられる認証手順

上記より、考えらる認証手順は次の通りです。
わざわざ書くほどでもないかも知れないけれども、まとめとして書いておく。

  1. リクエストしたコマンドが認証を要しないレベルならそのまま実行
  2. 認証を要するならトークンをもとにアカウント認証。賞味期限切れならここで 401 unauthenticated を返す。
  3. 認証されたアカウントに権限があるかチェックして、権限が無いなら 401 does not have permission を返す。

Androidで賞味期限切れのトークンを破棄する

破棄するのは AccountManager#invalidateAuthToken(String, String) です。

  • 第1引数は accountType で、この場合は "com.google" が入ります。authTokenType("fusiontables")ではないですよーこれでちょっと破棄できなくて困ったんですよー。
  • 第2引数は authToken で、トークン本体。

これで、トークンが破棄されるので、次のトークン取得時には新しいトークンが出てくれます。