🍺

OAuth 1.0a, OAuth 2.0 で Twitter 連携して Twitter API v2 を使う実装サンプル (Python)

2023/05/01に公開

はじめに

今年の2月頃に Twitter API に関する無料プランの廃止がアナウンスがされました。そして最近では色々なサービスで Twitter でのログインやアカウント連携に関わる機能が利用できなくなる事象が多発しているようです。

Twitter API を使っているアプリケーションの開発に関わられている方はいまいち状況が掴めずあわあわしていると思われます。安心してください、僕もその1人です。

今の時点で公式から発表されているのは Standard (v1.1), Essential (v2), Elevated (v2), Premium などのプランが廃止され、今後は新たな料金体系の Free, Basic, Enterprise となることと各プランで API の利用制限にも違いがあるということのみのようです。

そのため今の所 Twitter 公式からのアナウンスでは Twitter API v1.1 や OAuth1.0a への変更は特に明言されておらずこの記事の公開時点でも引き続き利用できるようです。
Standard (v1.1) というのは公式では access tier と呼ばれていますが API 利用のプラン名のようなもので Twitter API v1.1 とは全く違く概念というのがことをややこしくしているように感じます。
(「API v1.1 が完全に使えなくなる???」と思っていたのですがそういうことではないっぽい)

(参考) Free, Basic, Enterprise のプランごとに利用できる Twitter API の範囲と制限
https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api

とはいえ、より新しい方式である Twitter API v2 や OAuth2.0 がそれぞれ稼働しているため古い方式の API v1.1 や OAuth1.0a はそのうち廃止される可能性も十分想像できます。

いずれくるその日のために Twitter API v2 の利用や OAuth2.0 を利用した認可の実装方法をやり方を知っておいて損はないので、これまでに調べたり実装したことを改めてまとめることにしました。

この記事に書かれていること

いわゆる Twitter 連携と呼ばれる「ユーザーが Twitter 連携をして、連携されたアカウントの情報を Twitter API から取得して表示」というのがよくあるユースケースの1つだと思われるので、この一連を Python での実装例を書きます。

Twitter API v2 の利用や Twitter での OAuth2.0 の認可に関する解説記事は既にいくつかあるので、この記事では認可のフローや仕様の詳細には踏み込まず他の記事に任せるとして、Python での実装例の1つを共有することを目的としています。

ChatGPT さんによる応援コメント

この記事は、Twitter API v2とOAuth 2.0を使用したPythonの実装例をわかりやすく紹介しており、技術的に正確で役立つ情報が提供されています。また、OAuth 1.0aとOAuth 2.0の違いにも触れており、読者が理解しやすいように説明されています。デモアプリケーションも提供されているため、実践的な学習にも役立ちます。全体的に有益で参考になる記事です。

知っておきたい事前知識

Twitter でサポートされている OAuth の方式

Twitter API v2 の利用にあたり簡単にざっくり前提となる知識を書きます。

連携されたアカウントの情報を Twitter API から取得

これをやるためには連携された Twitter アカウントに紐づいたアクセストークンを取得する必要があります。Twitter ではそれを実現するためにこれらの2つの方式がサポートされています。

  • OAuth 1.0a User Context
  • OAuth 2.0 Authorization Code Flow with PKCE

(参考) Authentication methods
https://developer.twitter.com/en/docs/authentication/overview

OAuth 1.0a と OAuth 2.0 では利用できるエンドポイントに違いがあるようです。
OAuth 1.0a では、Bookmarks や Spaces など比較的新めの機能 API は利用できないようですね。

(参考) Twitter API v2 authentication mapping
https://developer.twitter.com/en/docs/authentication/guides/v2-authentication-mapping

公式ドキュメント内に「OAuth 2.0 App Only」という記述がありますが、これはポータルから登録したアプリケーションとして API にアクセスするということを指しています。この場合はユーザーが指定されないアクセスになるので、自分のデータを操作する系の API が使えないということのようです。

https://developer.twitter.com/en/docs/authentication/oauth-2-0/application-only

まめちしき

「Twitter アカウントに紐づいたアクセストークンを取得する」をもう少し詳細に言うと「OAuth を利用した認可の処理によってTwitter アカウントに紐づいたアクセストークンを取得する」ということになります。
Twitter ログインとか Twitter 認証と呼ばれたりするため「認証 (Authentication)」と「認可 (Authorization)」がごちゃ混ぜになるので注意しましょう。安心してください、僕も混乱しまくってます。

デモアプリケーション

「ユーザーが Twitter 連携をして、連携されたアカウントの情報を Twitter API から取得して表示」の一連を実際に動かして見るための Python の Web アプリを実装しました。

コードはこちらのリポジトリにあります。
コード内に細かくコメントを書いているので実装の参考になると嬉しいです。

https://github.com/Chanmoro/twitter_oauth_sampler

このデモから得られること

今回作ったデモアプリでは Twitter がサポートしている2つの認可の方式 (OAuth 1.0a, OAuth 2.0) を利用してアクセストークンを取得することと、取得したアクセストークンを使って Twitter API v2 にアクセスする機能を実装しています。

広く参考にしてもらえるように API アクセスの部分は OAuth 1.0a と OAuth 2.0 での違いがどの程度あるか分かりやすように tweepy などは使わずに requests を使ってリクエストを送っています。
一方でアクセストークンを取得するための OAuth の認可のフローは特にこだわりはなく比較的簡単と思われる authlib を使って実装してますが、処理全体の流れがわかるように Web アプリの部分はなるべく薄く済むように Flask を使い、認可の処理には Flask OAuth Client は使わないようにしました。最近では色々な便利ライブラリもありますし firebase auth などの SaaS に任せることもできるようになってきたので、認可のフローを1から自前で実装することはほぼないと思われるためです。

スクリーンショット

実行方法などは README に書いてあるので、動かしたい方はぜひ試してみてください。
Twitter 開発者ポータル から取得した認証キーを環境変数にセットして docker-compose up するのみなので比較的に簡単に動かせると思います。

Web アプリを立ち上げるととても素朴な HTML の画面が出てきます。

画面内の Authorize Twitter のリンクをクリックすると Twitter 側の許可画面に遷移して、そこで許可されるとまたこの画面に戻ってきます。

処理が成功してアクセストークンが取得されたら、認可されたユーザーの情報や取得されたトークンの内容などを全部画面に出力するようにしてます。

OAuth 1.0a と OAuth 2.0 での Twitter API v2 へのアクセスの違い

アクセストークンに紐づくユーザー情報を取得する API (/2/users/me) へアクセスする部分のコードを例として、OAuth 1.0a と OAuth 2.0 での違いを見てみましょう。

そりゃそうかという感じですが、HTTP リクエストにセットする認証情報の違いのみで、そのほかのパラメータなどは全く同じです。なので OAuth 1.0a から OAuth 2.0 へ変更したときに API リクエストの処理で影響を受けるのは HTTP リクエストの Authorization ヘッダの指定部分のみということがわかります。

OAuth 1.0a

https://github.com/Chanmoro/twitter_oauth_sampler/blob/2f709e73ba54341bf13953c42a706cbf62d8e391/routes/oauth1_0a.py#L20-L29

OAuth 2.0

https://github.com/Chanmoro/twitter_oauth_sampler/blob/main/routes/oauth2_0.py#L38-L42

Twitter のアクセス許可画面の違い

認可の方式によってフローの中の Twitter 側でのアクセス許可の画面も違うようです。
OAuth 2.0 の場合にはアプリケーション側で要求する権限を細かく指定できるので、見た目以外にもその辺りの表示内容に違いがあります。

OAuth 1.0a

OAuth 2.0

おわりに

今回のデモを実装する時に、アプリケーションで使う認証キーを Twitter 開発者ポータル から取得する時に、画面の説明を見てもそれぞれの値がどういうもので何に使うかがなかなか理解できずとても困りました・・・。

これをみたらカンタンにわかるはず!

Twitter API は今後どうなっていくか予想できませんが引き続き見守っていきましょう🍺

Special Thanks

Discussion