diff --git a/config/settings.py b/config/settings.py index d7153f9e..cceaba47 100755 --- a/config/settings.py +++ b/config/settings.py @@ -89,6 +89,7 @@ "mailing_list", "news", "core", + "providers", ] AUTH_USER_MODEL = "users.User" @@ -313,6 +314,7 @@ ACCOUNT_AUTHENTICATION_METHOD = "email" SOCIALACCOUNT_QUERY_EMAIL = True ACCOUNT_UNIQUE_EMAIL = True +OAUTH_SERVER_BASEURL = "https://www.stage.boost.cppalliance.org" # Allow us to override some of allauth's forms ACCOUNT_FORMS = { diff --git a/config/urls.py b/config/urls.py index 0ecaa996..0e7f044f 100755 --- a/config/urls.py +++ b/config/urls.py @@ -78,6 +78,7 @@ path("homepage-beta/", HomepageBetaView.as_view(), name="home-beta"), path("admin/", admin.site.urls), path("oauth2/", include("oauth2_provider.urls", namespace="oauth2_provider")), + path("accounts/provider/", include("providers.urls")), path("feed/downloads.rss", RSSVersionFeed(), name="downloads_feed_rss"), path("feed/downloads.atom", AtomVersionFeed(), name="downloads_feed_atom"), path("feed/news.rss", RSSNewsFeed(), name="news_feed_rss"), diff --git a/providers/__init__.py b/providers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/providers/admin.py b/providers/admin.py new file mode 100644 index 00000000..846f6b40 --- /dev/null +++ b/providers/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/providers/apps.py b/providers/apps.py new file mode 100644 index 00000000..c4f89de1 --- /dev/null +++ b/providers/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ProvidersConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "providers" diff --git a/providers/migrations/__init__.py b/providers/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/providers/models.py b/providers/models.py new file mode 100644 index 00000000..6b202199 --- /dev/null +++ b/providers/models.py @@ -0,0 +1 @@ +# Create your models here. diff --git a/providers/provider.py b/providers/provider.py new file mode 100644 index 00000000..144aca45 --- /dev/null +++ b/providers/provider.py @@ -0,0 +1,28 @@ +from allauth.socialaccount import providers +from allauth.socialaccount.providers.base import ProviderAccount +from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider + + +class BoostAccount(ProviderAccount): + pass + + +class BoostProvider(OAuth2Provider): + id = "provider" + name = "Boost OAuth2 Provider" + account_class = BoostAccount + + def extract_uid(self, data): + return str(data["id"]) + + def extract_common_fields(self, data): + return { + dict( + email="testing@testing.com", + first_name="Tester", + last_name="Testerson", + ) + } + + +providers.registry.register(BoostProvider) diff --git a/providers/tests.py b/providers/tests.py new file mode 100644 index 00000000..a39b155a --- /dev/null +++ b/providers/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/providers/urls.py b/providers/urls.py new file mode 100644 index 00000000..8455626b --- /dev/null +++ b/providers/urls.py @@ -0,0 +1,4 @@ +from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns +from .provider import BoostProvider + +urlpatterns = default_urlpatterns(BoostProvider) diff --git a/providers/views.py b/providers/views.py new file mode 100644 index 00000000..30383c9b --- /dev/null +++ b/providers/views.py @@ -0,0 +1,38 @@ +import requests +from allauth.socialaccount.providers.oauth2.views import ( + OAuth2Adapter, + OAuth2LoginView, + OAuth2CallbackView, +) +from .provider import BoostProvider +from django.conf import settings + + +class CustomAdapter(OAuth2Adapter): + provider_id = BoostProvider.id + + access_token_url = f"{settings.OAUTH_SERVER_BASEURL}/oauth2/token/" + profile_url = f"{settings.OAUTH_SERVER_BASEURL}/api/v1/users/me/" + + authorize_url = f"{settings.OAUTH_SERVER_BASEURL}/oauth2/authorize/" + + def dispatch(self, request, *args, **kwargs): + print("In the dispatch") + return super().dispatch(request, *args, **kwargs) + + def complete_login(self, request, app, token, **kwargs): + print("in the complete login method") + headers = { + "Authorization": f"Bearer {token.token}", + "Accept": "application/json", + } + kwargs["response"]["email"] + resp = requests.get(self.profile_url, headers=headers) + resp.raise_for_status() + print(resp.status_code) + extra_data = resp.json() + return self.get_provider().sociallogin_from_response(request, extra_data) + + +oauth2_login = OAuth2LoginView.adapter_view(CustomAdapter) +oauth2_callback = OAuth2CallbackView.adapter_view(CustomAdapter) diff --git a/templates/socialaccount/snippets/provider_list.html b/templates/socialaccount/snippets/provider_list.html index 2b74d2c9..157108b4 100644 --- a/templates/socialaccount/snippets/provider_list.html +++ b/templates/socialaccount/snippets/provider_list.html @@ -31,4 +31,14 @@ Use {{provider.name}} {% endif %} + {% if provider.name == "Boost OAuth2 Provider" %} + + Last Log in + + Use {{provider.name}} + + {% endif %} {% endfor %}