やったこと

webサービスを作るときに考えたことを垂れ流します

アンドロイドでツイッターログインすると変な挙動する

前回紹介した「ツイッターバトラーズ!」のゲームで、さっそく困った不具合が起きた。
一部のユーザーさんから、通信エラーでゲームできない!との報告があったのだ。
ユーザーさんのログを確認してみると「トークン不一致」のエラーが発生していた。


ツイッターバトラーズ!のゲームでは、ユーザーをツイッターアカウントによって管理していて、ゲーム開始時にツイッターログインをさせる仕組みになっている。
このログイン時にユーザー固有のトークン値を発行するようにして、正しいトークンを持ってるユーザーでないと通信させないようにしてある。
今回の不具合はこのトークン値が不一致となったせいでゲーム不能となっていた。
他のログを見ると、このユーザーさんだけではなくて、他にも何人か似たような現象が起きている様子。みんなアンドロイドのユーザーだったので、たぶんアンドロイドスマホで起きる特有の不具合なんだと思う。
(※ちなみにサーバ側の環境を書いておくと、CakePHP 2.5.8、Opauthというプラグインツイッターログインさせている)


ログイン記録を詳しく観察してみると、以下のような挙動をしてることが分かった。

①初めにユーザーがツイッターログインしてくる
②その3秒後くらいになぜかもう一度ログインしてくる
③サーバー側では二回目にログインしたときのトークンを保持してる
④でもクライアン側はなぜか一回目にログインしたときのトークンを通知してくる
⑤トークン不一致になる!

トークン値はHTML内に記述してるので、たぶんクライアント側は二回ログインしてきたくせに一回目で取得した古いHTMLを参照してしまってるんだと思う。
自分が公開前に試験したときに、アンドロイドの仮想マシンで標準ブラウザを開いて色々挙動を確認したんだけど、こういう現象は発生しなかった。たぶん実機でだけ発生するやっかいな現象なんでしょうな・・。


なんでこういう挙動をするのか原因がよく分からなくて、どういう対応をしようか悩んだんだけど、仕方がないのでトークンを発行する処理に以下のようなルールを加えることにした。

「ユーザーが前回ログインしたときから30秒以内に再ログインしてきた場合は、同一のトークンを発行する」

これで連続でログインしてくる変な端末もちゃんとゲームできるようになると思う。

なんかすごい見苦しい最低な感じの修正だけどしょうがないよね。だってアンドロイドの人にもゲームしてほしいんだもん・・。