[追記予定]TwitterAPIのアクセストークンを取得する

110
_110365
Published in
6 min readFeb 11, 2021

Twitter APIを使ってユーザーがアプリ連携→画像付きツイートできるようにしたい。
Rubyを使っているのでtwitter gem とかoauth gemとか色々あるけれど、きっと何かの勉強になると信じてAPIドキュメントを見ながら自前実装します。

注意:筆者の都合で続きに着手できておらず、アプリ連携のリクエストのデータを作る途中で止まっています。大変中途半端ですが、ひょっとしたらほんの少しは誰かの役に立つかもしれないので調べたところまでを公開します。

認証方法がたくさんありすぎて分からない。

  • OAuth 1.0a: アカウントのプライベートな情報とかユーザーの代わりにアプリがTwitterに対する操作をするようなAPIはこれを使うみたい
  • OAuth 2.0 Bearer Token: Twitter上で公開されてるオープンな情報はこれ使うみたい
  • Basic authentication: “enterprise API”って書いてあるので関係なさそう

今回はOAuth 1.0aというやつを使う。
そのOauth 1.0aの中にもさらに何種類か認証方法があって泣きそうになる。

Please note: Consumer keys can be obtained from your Twitter apps detail page found in the developer portal, where you can also generate an access token and access token secret. To generate access tokens for a different user, you will need to go through the 3-legged OAuth process.

とあるので、

  • botみたいに自分が所有するアカウントを操作するなら、developerポータルでAPIキー(コンシューマーキー)と自分のアクセストークンを生成すればよい
  • 他のユーザーのアカウントに対する操作をしたいなら、そのユーザーのアクセストークンが必要なので、3-legged Oauthなるものをする必要あり

ということらしい。すでに疲れました。

ちなみにこれ以外の認証方法は、
PIN-based authorization(アプリ認証後にブラウザで表示できるWebページがない場合などに使う)と Oauth Echo(TwitPicが例に出されてる。Twitterアカウントを使って会員登録なしにログインして使えるのがこれなのかな?)がある。
最初見たときは結局どれ?もしかして全部やるの?状態だったけれど、ここまで分かれば安心して3-legged Oauthできます!
(3-legged Oauthってなんだろう)

3-legged Oauthの流れ

前述の通り、他のユーザーの代わりに何かする(ツイートを読み取る、ツイートを投稿する、etc)にはそのユーザーのアクセストークンを発行する必要があります。そのために必要なステップは次の3つ。

  1. Twitter APIに、「リクエストトークンください」のリクエストを送る
  2. ユーザーがアプリ認証してくれたら、リクエストトークンを受け取る
  3. 貰ったリクエストトークンをユーザーのアクセストークンに変換する

1. Twitter APIに「リクエストトークンください」のリクエストを送る

関連API: POST oauth/request_token

Twitter APIがどうというよりは、Oauth 1.0に沿って進める必要があるようでAPIドキュメント見ただけじゃ分からなさそう。
・・・と思ったらドキュメント内にちゃんと説明ありました。
https://developer.twitter.com/ja/docs/basics/authentication/guides/authorizing-a-request

必要なパラメータは以下の通り

  • oauth_consumer_key(コンシューマーキー)
    => Twitter developerポータルで発行したAPIキーを使う
  • oauth_callback(コールバックURL)
    => ユーザーがアプリを承認した後にリダイレクトされるURL。developerポータル内の設定でホワイトリストに追加しておく必要があるので忘れずに。
  • oauth_signature_method(電子署名の方法)
    => “HMAC-SHA1” 固定。
  • oauth_signature(電子署名)
    => HMAC-SHA1を使ってプログラムで生成する。難関。
  • oauth_timestamp(タイムスタンプ)
    => プログラムで生成する。
  • oauth_nonce(ノンス/number used once)
    => プログラムで生成する。
    なぜ必要かについてはwikipediaがわかりやすい
  • oauth_version(Oauthバージョン)
    => “1.0” 固定。デフォルトで1.0として扱われるため省略可

これらがなぜ必要かというと、
(1) どのアプリがリクエストを送ってきたのか
(2) アプリがどのユーザーの代理としてリクエストを送っているのか
(3) ユーザーはアプリに代理として操作することを許可したか
(4) リクエストが第三者によって改ざんされていないか
といったことを確認するため。

パラメータのうちoauth_signatureの生成方法がやたら複雑。
度々パーセントエンコードする必要があるが、RubyのURI#encode_www_form_component などのメソッドはスペースが「+」にエンコードされるので不十分。他にいい方法が見つからず、deprecatedになっているURI#escape の第二引数でエスケープする文字を指定して対応中です。

# 例) "Ladies + Gentlemen" をパーセントエンコードする
# 求める結果: Ladies%20%2B%20Gentlemen
URI.encode_www_form_component("Ladies + Gentlemen")
#=> "Ladies+%2B+Gentlemen" # スペースのエンコードが違う

(追記予定)

--

--