不正なトークンの正体が分かった気がする( ・´ω・`)


ダラダラと作り続けているというかちょこちょこ手直ししていて
中々完成しない、はてなハイク投稿用ツールには2つのエラーを孕んでいた。

どちらもOAuthトークン絡みで、一つはOAuthトークンがリジェクトされてしまうケース
("token_rejected")、もう一つは"不正なトークン"として処理が進まないケースであった。

前者ははてなハイクへの投稿に失敗してしまい、クッキーを削除して
もう一度OAuth認可からやり直さなければならず、投稿内容は
当然失われるという致命的なエラー、後者はOAuth認可に進むことが出来ず、
もう一度アップロード作業をするとうまく行ったりまた失敗したりと
いう原因不明のエラーだった。


最初の頃は2つの違いも分からず発生タイミングも理解してなかったが、
色々と調べていくうちに前者のケースはOAuthトークンを用いて
はてなハイクに投稿するタイミングで発生することが分かってきた。

加えてそれは複数のデバイス(例えばPCと3DS)でOAuth認可を行った後、
古いトークンを持つデバイスで投稿をしようとした時にrejectされる
ということがわかった。

ということでこれに関しては常にトークンの有効性を確認してから
投稿ツールに遷移することにしたのでこのエラーは出なくなった。

もう一つの"不正なトークンのエラー"については今ひとつ
発生原因がつかめず、発生頻度もそれほどでもなかったので後回しにしていた。


その後、放置したり作ったりを繰り返し、ようやっとツール作成も最終段階に突入。
未だに発生原因が分からない"不正なトークンのエラー"は余り気にせず、
連携機能のテストを行っていた時のこと。

クッキー削除→fotolifeにアップロード→OAuth認可の為に認可URLに移動→
不正なトークンエラー→戻って再アップロード→OAuth認可の為に認可URLに移動→
不正なトークンエラーという事態が発生した。

今までだと大体なら一回やり直せばうまく行っていたのに、
この時はうまく行かなかったので気になる。
もう最終段階でもあるし、後回しにしすぎていたという
思いもあったのでようやく重い腰を上げて調べ始めた。

初めは古いRequestトークンがセッションで残っていて
それが悪事を働いてるのかと思って、OAuthトークンを正しく取得出来た後に
明示的に削除するようにしたが状況は変わらず。


何がなんだかよくわからないのでlog.infoしていたRequestトークンの内容を見てみた。

不正なトークン
111

うまくいったトークン
222

一見してRequestトークンの末尾がおかしい。
これか(・∀・) ワイノカチヤデ

と喜び勇んで一旦tempのTokenに食わせて取り出してtrimして
再度Tokenにしてみたが状況は変わらず…_| ̄|○

Token.toStringの中を見ても

return String.format("Token[%s , %s]", new Object[] { this.token, this.secret });

という感じなので、これは関係ないか…__◯_

よくよく見るとフォントが違うだけの問題なのかこれは。


だがしかし、エラー画面のURLを見つめるうちに何かを頭の中をかすめた。
333

( ゚Д゚)ハッ これ普通に考えたら"+"が空白として解釈されるんじゃね( ;・´ω・`)ゴクリッ?

幾度かOAuth認可を試してみると、確かに不正なトークンとしてエラーが出るのは
"+"が中に含まれている時のみ……


というわけで取り敢えずindexOfして"+"があったらRequestトークンを
再取得するループを入れたコードにして試してみる。
20回程試してみたがエラーが発生しないヽ( ・∀・)ノ

だから多分今までのエラーの原因は"+"だったのであろうという結論に達した。
つまりRequestトークンをパーセントエンコードしてなかった俺が悪いのか (ヽ'ω`)
自分でやんないと駄目なんだな。


再取得ループは間抜けなのでパーセントエンコードの方に直さないといけないな。
まあでもこれで致命的なエラーはなくなったから良かった良かった(・∀・)

後、エラーというほどでもないけど謎なのは、3DSから認可をした場合に
何故か複数回OAuthトークンが返されるのだけれども、あれは3DSブラウザの
仕様なんだろうか。PCでは一回だけのようだけれども。うーむ(´・ω・`)