This commit is contained in:
Iliyan Angelov
2025-09-14 23:24:25 +03:00
commit c67067a2a4
71311 changed files with 6800714 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
from allauth.socialaccount.providers.base import ProviderAccount
from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
class TwitterOAuth2Account(ProviderAccount):
def get_username(self):
return self.account.extra_data.get("username")
def get_profile_url(self):
username = self.get_username()
if username:
return "https://twitter.com/" + username
return None
def get_avatar_url(self):
return self.account.extra_data.get("profile_image_url")
def to_str(self):
username = self.get_username()
return username or super(TwitterOAuth2Account, self).to_str()
class TwitterOAuth2Provider(OAuth2Provider):
id = "twitter_oauth2"
name = "Twitter"
account_class = TwitterOAuth2Account
pkce_enabled_default = True
def extract_uid(self, data):
return data["id"]
def extract_common_fields(self, data):
return dict(
name=data["name"],
username=data["username"],
)
def get_fields(self):
settings = self.get_settings()
default_fields = [
"id",
"name",
"username",
"verified",
"profile_image_url",
"created_at",
]
return settings.get("FIELDS", default_fields)
def get_default_scope(self):
return ["users.read", "tweet.read"]
provider_classes = [TwitterOAuth2Provider]

View File

@@ -0,0 +1,24 @@
from allauth.socialaccount.tests import OAuth2TestsMixin
from allauth.tests import MockedResponse, TestCase
from .provider import TwitterOAuth2Provider
class TwitterOAuth2Tests(OAuth2TestsMixin, TestCase):
provider_id = TwitterOAuth2Provider.id
def get_mocked_response(self):
return MockedResponse(
200,
"""{
"data": {
"created_at": "2020-09-02T13:39:14.000Z",
"id": "1301152652357595137",
"verified": false,
"username": "realllkk520",
"name": "realllkk520",
"profile_image_url": "https://pbs.twimg.com/profile_images/1537259565632593920/OoRGPbUg_normal.jpg"
}
}
""",
) # noqa

View File

@@ -0,0 +1,6 @@
from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
from .provider import TwitterOAuth2Provider
urlpatterns = default_urlpatterns(TwitterOAuth2Provider)

View File

@@ -0,0 +1,40 @@
import requests
from allauth.socialaccount.providers.oauth2.views import (
OAuth2Adapter,
OAuth2CallbackView,
OAuth2LoginView,
)
from .provider import TwitterOAuth2Provider
class TwitterOAuth2Adapter(OAuth2Adapter):
provider_id = TwitterOAuth2Provider.id
access_token_url = "https://api.twitter.com/2/oauth2/token"
authorize_url = "https://twitter.com/i/oauth2/authorize"
profile_url = "https://api.twitter.com/2/users/me"
basic_auth = True
def complete_login(self, request, app, access_token, **kwargs):
extra_data = self.get_user_info(access_token)
return self.get_provider().sociallogin_from_response(request, extra_data)
def get_user_info(self, token):
fields = self.get_provider().get_fields()
headers = {}
headers.update(self.get_provider().get_settings().get("HEADERS", {}))
headers["Authorization"] = " ".join(["Bearer", token.token])
resp = requests.get(
url=self.profile_url,
params={"user.fields": ",".join(fields)},
headers=headers,
)
resp.raise_for_status()
data = resp.json()["data"]
return data
oauth2_login = OAuth2LoginView.adapter_view(TwitterOAuth2Adapter)
oauth2_callback = OAuth2CallbackView.adapter_view(TwitterOAuth2Adapter)