no-image

Flask×Twitterでログイン機能実装②|OAuth認証でTwitterと連携

今回は、PythonのWEBフレームワークFlaskで、OAuth認証を使用したTwitter連携の方法について解説していきます。

こちらの記事の続きです。
独学WEB開発の壁、ログイン機能実装を突破するFlaskチュートリアル①|前提知識編

OAuth認証の実装はかなり苦労しました。
実は、以前にも下の記事でTweepyというライブラリを用いたOAuth認証によるTwitter連携は実装したことがあるのですが、今回は自分の勉強も兼ねて、Tweepyを使わずに作ってみました。

Twitterで自動ふぁぼ、認証機能を実装してWEBアプリ化!

正直Tweepyを使った認証の方が簡単だったので、今回の方法でTwitter連携がうまくできなかったという方は、Tweepyを使ってみてもいいかもしれません。
余談ですが、GoogleのFirebaseの機能を使っても、シンプルに認証ができるそうです。

OAuth認証について詳しく学びたい方はこちらもおすすめ。
少し値は張りますが、Amazonのベストセラーです。

OAuth徹底入門 セキュアな認可システムを適用するための原則と実践

それでは、さっそく実装していきましょう。

もくじ

  1. はじめに
  2. TwitterAPIとOAuth認証
  3. Twitter認証のためのURLを取得する
  4. 参考

はじめに

こんかい用意するものはこちら。

・Python3.7
・Flask1.0.2
・TwitterAPIのキー

TwitterAPIのキーを持っていない方は、TwitterDevelopersへの登録を先に済ませておきましょう。
こちらでAPIキーとシークレットキーを取得し、CallbackURLを設定しておく必要があります。

詳しくはこちらが参考になります。
PythonでTwitter API を利用していろいろ遊んでみる

必要な準備ができたら、OAuth認証についての解説にすすみます。

TwitterAPIとOAuth認証

TwitterAPI連携には、OAuth1.0という認証プロトコルを使用します。
このOAuht認証とは、APIとクライアント間のデータのやり取りを安全に行うためのプロトコルです。

リクエストトークンと認証サーバーを用いて、承認されたクライアントだけが、APIのリソースサーバーにデータを要求できるアクセストークンを入手できます。

OAuth1.0のドキュメントに、わかりやすいフロー図がありましたので、貼っておきます。

OAuth認証の大まかな流れは、これで理解していただけたかと思います。
ここからは、TwitterAPIの公式ドキュメントを参考にしながら、頑張ってTwitter連携を実装していこうと思います。

TwitterAPIドキュメント

STEP1:リクエストトークンを取得する

認証の最初のステップは、リクエストトークンを取得することです。
ドキュメントを参考にすると、以下のような情報を含んだHTTPリクエストを送信してOAuth接続を行うようなのですが、自力でやるには少し大変そうです。

POST /oauth/request_token HTTP/1.1
User-Agent: themattharris' HTTP Client
Host: api.twitter.com
Accept: */*
Authorization:
        OAuth oauth_callback="http%3A%2F%2Flocalhost%2Fsign-in-with-twitter%2F",
              oauth_consumer_key="cChZNFj6T5R0TigYB9yd1w",
              oauth_nonce="ea9ec8429b68d6b77cd5600adbbb0456",
              oauth_signature="F1Li3tvehgcraF8DMJ7OyxO4w9Y%3D",
              oauth_signature_method="HMAC-SHA1",
              oauth_timestamp="1318467427",
              oauth_version="1.0"

幸いPythonには、OAuth認証のための便利なライブラリもありますので、そちらを使うことにしました。
こちらの記事を参考にしました。

[Python] OAuth認証でTwitter連携/ログインを実装する

丁寧に進めていきます。
まずはrequests_oauthlibのOAuth1Sessionメソッドを使ってOAuth認証を開始しましょう。
以下のコードを実行してみます。

OAuth1Sessionメソッドの引数には、取得したキーを指定してあげます。

from requests_oauthlib import OAuth1Session
from urllib.parse import parse_qsl

ck = "取得したConsumerKey"
cs = "取得したConsumerSecret"

#今回はローカルのWEBサーバーで動かすため、127.0.0.1/callbackに設定
callbackUrl = "設定したCallbackURL"

twitter = OAuth1Session(consumer_key, consumer_secret)
print(twitter)

上記のコードを実行すると次の一行が表示されます。

requests_oauthlib.oauth1_session.OAuth1Session object at 0x7f4f6835b9e8

このままではよくわからなかったので、内部的にどんな処理をしているのかドキュメントを参照しました。

requests/requests-oauthlib|Github

class OAuth1Session(requests.Session):
    """Request signing and convenience methods for the oauth dance.
    What is the difference between OAuth1Session and OAuth1?
    OAuth1Session actually uses OAuth1 internally and its purpose is to assist
    in the OAuth workflow through convenience methods to prepare authorization
    URLs and parse the various token and redirection responses. It also provide
    rudimentary validation of responses.
    An example of the OAuth workflow using a basic CLI app and Twitter.
    >>> # Credentials obtained during the registration.
    >>> client_key = 'client key'
    >>> client_secret = 'secret'
    >>> callback_uri = 'https://127.0.0.1/callback'
    >>>
    >>> # Endpoints found in the OAuth provider API documentation
    >>> request_token_url = 'https://api.twitter.com/oauth/request_token'
    >>> authorization_url = 'https://api.twitter.com/oauth/authorize'
    >>> access_token_url = 'https://api.twitter.com/oauth/access_token'
    >>>
    >>> oauth_session = OAuth1Session(client_key,client_secret=client_secret, callback_uri=callback_uri)
    >>>
    >>> # First step, fetch the request token.
    >>> oauth_session.fetch_request_token(request_token_url)
    {
        'oauth_token': 'kjerht2309u',
        'oauth_token_secret': 'lsdajfh923874',
    }
    >>>
    >>> # Second step. Follow this link and authorize
    >>> oauth_session.authorization_url(authorization_url)
    'https://api.twitter.com/oauth/authorize?oauth_token=sdf0o9823sjdfsdf&oauth_callback=https%3A%2F%2F127.0.0.1%2Fcallback'
    >>>
    >>> # Third step. Fetch the access token
    >>> redirect_response = raw_input('Paste the full redirect URL here.')
    >>> oauth_session.parse_authorization_response(redirect_response)
    {
        'oauth_token: 'kjerht2309u',
        'oauth_token_secret: 'lsdajfh923874',
        'oauth_verifier: 'w34o8967345',
    }
    >>> oauth_session.fetch_access_token(access_token_url)
    {
        'oauth_token': 'sdf0o9823sjdfsdf',
        'oauth_token_secret': '2kjshdfp92i34asdasd',
    }
    >>> # Done. You can now make OAuth requests.
    >>> status_url = 'http://api.twitter.com/1/statuses/update.json'
    >>> new_status = {'status':  'hello world!'}
    >>> oauth_session.post(status_url, data=new_status)
    
    """
    def __init__(
        self,
        client_key,
        client_secret=None,
        resource_owner_key=None,
        resource_owner_secret=None,
        callback_uri=None,
        signature_method=SIGNATURE_HMAC,
        signature_type=SIGNATURE_TYPE_AUTH_HEADER,
        rsa_key=None,
        verifier=None,
        client_class=None,
        force_include_body=False,
        **kwargs
    ):

こちらのソースを見ると、どうやら渡したAPIキーを格納したオブジェクトが返ってきているようです。
まずはfetch_request_tokenメソッドを使えば良さそうです。

ここでOAuth認証のためのトークンを取得したら、認証用のURLを取得します。
authorization_urlメソッドを使います。

ここまでのコードを見てみましょう。

from requests_oauthlib import OAuth1Session
from urllib.parse import parse_qsl

ck = "取得したConsumerKey"
cs = "取得したConsumerSecret"

#今回はローカルのWEBサーバーで動かすため、127.0.0.1/callbackに設定
callbackUrl = "127.0.0.1/callback"

#TwitterAPI連携のための各種URL
request_token_url = 'https://api.twitter.com/oauth/request_token'
authorization_url = 'https://api.twitter.com/oauth/authorize'
access_token_url = 'https://api.twitter.com/oauth/access_token'

#OAuth認証のためのオブジェクト
twitter = OAuth1Session(ck, cs)

#認証用URLの取得
twitter.fetch_request_token(request_token_url)
authUrl = twitter.authorization_url(authorization_url)

print(authUrl)

このコードを実行すると、Twitterアカウントと連携するための確認画面のURLを取得できます。

予想外に長くなったので、続きは次回の記事にしましょう。
次は認証されたユーザーのアカウントを操作するためのアクセストークンの入手を行います。

参考

Twitterで自動ふぁぼ、認証機能を実装してWEBアプリ化!

OAuth徹底入門 セキュアな認可システムを適用するための原則と実践

PythonでTwitter API を利用していろいろ遊んでみる

OAuth1.0のドキュメント

requests/requests-oauthlib|Github

前の記事
Flask×Twitterでログイン機能実装①|前提知識編

次の記事
Flask×Twitterでログイン機能実装③|アクセストークンを取得