概要
Java でライブラリを使わず OAuth 認証を実装に挑戦. しかし, ひたすら 401 ではじかれた(泣). 私の場合 URL エンコードが主な原因だったのでその対策を記載.
Java で URL エンコードする方法
URLEncoder クラスの encode メソッドでエンコードできます.
public static String urlEncode(String target){
String encode = "";
try{
encode = URLEncoder.encode(target, StandardCharsets.UTF_8.toString());
}catch(Exception e){
e.printStackTrace();
}
return encode;
}
署名用文字列の確認方法
実際に Twitter API を通すことのできる署名用文字列のサンプルはツールから生成して確認することができます.
上記ページが Twitter API の公式リファレンス.
使いたい API を選択してページの最下部に表示すると OAuth Signature Generator があります. ジェネレーターから署名用文字列を生成できます.
※ ジェネレーターを使うには Application Management でアプリを作成する必要があります
はまったポイント
- クエリパラメーターを URL エンコードしていなかった
- 署名用文字列に追加するクエリパラメーターは URL エンコードされたものをさらにエンコードすることになる
- API の中には POST でも URL にクエリパラメーターを含めなくてはいけないものがある
1.クエリパラメーターを URL エンコードしていなかった
1に関してはまさにそのままの理由でした. テストで英文字しか使っていない場合, 意外と気づけなかったので注意.
2.署名用文字列に追加するクエリパラメーターは URL エンコードされたものをさらにエンコードすることになる
2は署名用文字列を生成する際の注意点. すでにクエリパラメーターの段階でエンコードされているからエンコードしないのではなく署名用文字列生成時には再度, 各クエリパラメーターに対して URL エンコード行う必要があるようです.
例)
艦これ → %25E8%2589%25A6%25E3%2581%2593%25E3%2582%258C
上記例だと2度エンコードされた結果 %
がさらにエンコードされ %25
となっています. このことはジェネレーターで確認すると分かります.
3.APIの中にはPOSTでもURLにクエリパラメーターを含めなくてはいけないものがある
3はかなり悩まされました, API の statuses/update
を例に挙げたいと思います.左記のエントリポイントはツイートの投稿に使えるのですがドキュメントでは POST で送信することになっています. そう思ってHTTPボディにクエリパラメーターを付加して送信しても 401 で失敗します.
これに関してはドキュメントの Example Request を見ると POST なのに URL にクエリパラメーターが付加されていることが分かります. Example Request 通りに POST でも URL にクエリパラメーターを追加すると投稿できました. どうやらエントリポイントの中には POST であっても URL にクエリパラメーターを含めなくてはならないものがいくつかあるようです.
ちなみに Streaming API 1 の statuses/filter
のエントリポイントは POST 通信で URL にクエリを付加する必要がないなど色々バラバラでした.
結論
ドキュメントをしっかりと読まなくてはならない(小並感). この記事が何かの参考になれば幸いです. ご指摘などあればご遠慮なくお願いいたします.