単純な“Twitterとのログイン”を使用して、Python、djangoとdjangoレストフレームワークを使用します.

15724 ワード

Twitterが批判されている一つのことは、APIの悪いドキュメントです.APIのいくつかはよく文書化されていません.Twitterのドキュメントを使用することで、時々多くの時間を過ごすことができます.最近、私はユーザーがTwitterでログインできる機能を持つJjangoプロジェクトに取り組んでいました.だから、私はTwitterのOAuth 1 APIとのインターフェイスを使用して簡単な方法requests_oauthlib 図書館.私はすでに使用していたrequest_oauthlib 他のサードパーティのAPIとのインターフェイスをライブラリには、代わりに代わりに使用してスティックを選択します.私がオンラインで得たすべての解決は、私に誤りを与えていました.これらのオンラインソリューションの問題は、必要なパラメータのいずれかですoauth_callback_url ) Twitterにリクエストを送るのは省略されますauth/request_token エンドポイントまたはgetリクエストはPOSTリクエストの代わりに送られます.それを実現すると、自分で何かを試してみることにした.幸いにも、それは私のために働いた.私が通過したハードルをスペアにするために、この短い記事は、あなたのDjangoプロジェクトでTwitterでログインを実行することを通してあなたを案内することを目指します.
前に述べたように、私はrequests_oauthlib 図書館.これは、DJangoプロジェクトを設定するには、Twitterのアプリを作成し、すべての必要なTwitterアプリの設定を行うには、この記事の範囲を超えていることに注意することが重要です.それらを助けることができる多くのリソースのオンラインがあります.しかし、私はそれを言及する必要があります、あなたのコールバックのURLを設定し、“このアプリはTwitterでログインするために使用できるようにチェックするか?”Twitterで無効にされているあなたの要求を避けるためにあなたのTwitterのアプリのダッシュボードのオプション.コールバックURLは、あなたがTwitterを直接認証をした後に認証したい場所です.
Twitterでログインを実行するには3つの手順があります.リクエストトークンを取得し、ユーザーをリダイレクトし、リクエストトークンをアクセストークンに変換します.実装では、ステップが終了し、もう一方が始まるところを指摘するのは難しいかもしれません.つの手順の実行に飛び込む前に、これらの行をURLに含めます.Pyファイル.
from django.urls import path
from . import views

urlpatterns += [  
  path(
        "auth/twitter/redirect/",
        views.TwitterAuthRedirectEndpoint.as_view(),
        name="twitter-login-redirect",
   ),
   path(
    "callback/twitter/",
     views.TwitterCallbackEndpoint.as_view(),
     name="twitter-login-callback",
   ),
]
我々は最終的にここにある!
手順1 :一時リクエストトークンを要求する.
この流れの最初のステップは署名されたメッセージを送ることによって要求トークンを得ることですPOST oauth/request_token . あなたがここで注意しなければならないカップルのものがあります.まず、リクエストはPOSTリクエストである必要があります.第二に、要求の本文が含まなければなりませんoauth_callback_url , URLをURLエンコードされたバージョンでなければなりません.このURLがアプリケーションダッシュボードに設定されているものと一致しない場合、Twitterはエラー応答を返します.
Step 2 :ユーザをリダイレクトする.
次のステップは、ユーザーがTwitterにあなたのアプリケーションを認可するように指示することです.この実装はユーザをリダイレクトすることですoauth/authenticate 前のステップから得られたOAuthRankトークンを通過している間、端点をつけてください.
あなたの見解で.Pyファイルには、次のコードが含まれます.
from requests_oauthlib import OAuth1
from urllib.parse import urlencode
from rest_framework.views import APIView
from django.http.response import  HttpResponseRedirect

class TwitterAuthRedirectEndpoint(APIView):
    def get(self, request, *args, **kwargs):
        try:
            oauth = OAuth1(
                      settings.TWITTER_API_KEY, 
                      client_secret=settings.TWITTER_API_SECRET_KEY
            )
             #Step one: obtaining request token
            request_token_url = "https://api.twitter.com/oauth/request_token"
            data = urlencode({
                      "oauth_callback": settings.TWITTER_AUTH_CALLBACK_URL
            })
            response = requests.post(request_token_url, auth=oauth, data=data)
            response.raise_for_status()
            response_split = response.text.split("&")
            oauth_token = response_split[0].split("=")[1]
            oauth_token_secret = response_split[1].split("=")[1]  

                #Step two: redirecting user to Twitter
            twitter_redirect_url = (
         f"https://api.twitter.com/oauth/authenticate?oauth_token={oauth_token}"
            )
            return HttpResponseRedirect(twitter_redirect_url)
        except ConnectionError:
             html="<html><body>You have no internet connection</body></html>"
            return HttpResponse(html, status=403)
        except:
              html="<html><body>Something went wrong.Try again.</body></html>"
            return HttpResponse(html, status=403)
ユーザーがヒットするとauth/twitter/redirect/ URLTwitterAuthRedirectEndpoint POSTリクエストを行うビューが実行されますoauth/request_token URLのエンコードされたバージョンのリクエストの本文のURLを使用します.リクエストが正常に終了すると、応答が解析されますoauth_token , and oauth_secret . これの後、ユーザーはURLにリダイレクトされますhttps://api.twitter.com/oauth/authenticate?oauth_token=oauth_token を含むoauth_token パラメータ
ステップ3 :一時リクエストトークンをトークンにアクセスする.
認証が成功すると、コールバックURLはクエリパラメータを含むリクエストを受け取りますoauth_token とOAuthSum検証器.最後のステップは、OAuth/AccessResトークンエンドポイントにポストリクエストを作成することですoauth_token アクセストークンを指定します.リクエストには、クエリパラメータとしてOAuSum Verifierを含める必要があります.成功したリクエストでは、応答はOAuthRankトークンとoauth_token__secret パラメータ.これらのトークンを格納することができますし、将来的に要求をするために使用します.
class TwitterCallbackEndpoint(APIView):
         def get(self, request, *args, **kwargs):
               try:
                   oauth_token = request.query_params.get("oauth_token")
                   oauth_verifier = request.query_params.get("oauth_verifier")
                   oauth = OAuth1(
                                     settings.TWITTER_API_KEY,
                                     client_secret=settings.TWITTER_API_SECRET_KEY,
                                     resource_owner_key=oauth_token,
                                     verifier=oauth_verifier,
                    )
                   res = requests.post(
                               f"https://api.twitter.com/oauth/access_token", auth=oauth
                    )
                    res_split = res.text.split("&")
                   oauth_token = res_split[0].split("=")[1]
                   oauth_secret = res_split[1].split("=")[1]
                   user_id = res_split[2].split("=")[1] if len(res_split) > 2 else None
                   user_name = res_split[3].split("=")[1] if len(res_split) > 3 else None
                   f#store oauth_token, oauth_secret, user_id, user_name
                   redirect_url="https: //www.where-to-redirect-users-to"
                  return HttpResponseRedirect(redirect_url)
             except ConnectionError:
                   return HttpResponse(
                             "<html><body>You have no internet connection</body></html>", status=403
                   )
             except:
                  return HttpResponse(
                           "<html><body>Something went wrong.Try again.</body></html>", status=403
                  )
二つの線TwitterCallbackEndpoint oauthchenトークンを取得し、oauth_verifier TwitterのコールバックURLに送信します.以来、OAuth1 クラスには、検証フィールドが設定されていますoauth_verifier Auth/accessCountトークンエンドポイントへのパラメータ.
お読みありがとうございます.