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.account.models import EmailAddress
from allauth.socialaccount import providers
from allauth.socialaccount.providers.base import AuthAction, ProviderAccount
from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
class SalesforceAccount(ProviderAccount):
def get_profile_url(self):
return self.account.extra_data.get("link")
def get_avatar_url(self):
return self.account.extra_data.get("picture")
def to_str(self):
dflt = super(SalesforceAccount, self).to_str()
return self.account.extra_data.get("name", dflt)
class SalesforceProvider(OAuth2Provider):
id = "salesforce"
name = "Salesforce"
package = "allauth.socialaccount.providers.salesforce"
account_class = SalesforceAccount
def get_default_scope(self):
return ["id", "openid"]
def get_auth_params(self, request, action):
ret = super(SalesforceProvider, self).get_auth_params(request, action)
if action == AuthAction.REAUTHENTICATE:
ret["approval_prompt"] = "force"
return ret
def extract_uid(self, data):
return str(data["user_id"])
def extract_common_fields(self, data):
return dict(
email=data.get("email"),
last_name=data.get("family_name"),
first_name=data.get("given_name"),
username=data.get("preferred_username"),
)
def extract_email_addresses(self, data):
# a salesforce user must have an email, but it might not be verified
email = EmailAddress(
email=data.get("email"),
primary=True,
verified=data.get("email_verified"),
)
return [email]
providers.registry.register(SalesforceProvider)

View File

@@ -0,0 +1,67 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from allauth.socialaccount.tests import OAuth2TestsMixin
from allauth.tests import MockedResponse, TestCase
from .provider import SalesforceProvider
class SalesforceTests(OAuth2TestsMixin, TestCase):
provider_id = SalesforceProvider.id
def get_mocked_response(
self,
last_name="Penners",
first_name="Raymond",
name="Raymond Penners",
email="raymond.penners@gmail.com",
verified_email=True,
):
userinfo = USERINFO_RESPONSE.format(
org_id="00Dxx00000000000A0",
user_id="005xx000000aWwRQAU",
vip="https://test.salesforce.com",
nickname="test-ooi2xhmjteep",
first_name=first_name,
last_name=last_name,
my_domain="https://fun.cs46.my.salesforce.com",
content_domain="https://fun--c.cs46.content.force.com",
verified_email=repr(verified_email).lower(),
email=email,
active="true",
is_app_installed="true",
)
return MockedResponse(200, userinfo)
USERINFO_RESPONSE = """
{{
"sub": "{vip}/id/{org_id}/{user_id}",
"user_id": "{user_id}",
"organization_id": "{org_id}",
"preferred_username": "{nickname}@sample_-_dev_workspace.net",
"nickname": "{nickname}",
"name": "{first_name} {last_name}",
"email": "{email}",
"email_verified": {verified_email},
"given_name": "{first_name}",
"family_name": "{last_name}",
"zoneinfo": "America/Los_Angeles",
"photos": {{
"picture": "{content_domain}/profilephoto/005/F",
"thumbnail": "{content_domain}/profilephoto/005/T"
}},
"profile": "{my_domain}/{user_id}",
"picture": "{content_domain}/profilephoto/005/F",
"address": {{"country": "US"}},
"urls": {{"custom_domain": "{my_domain}"}},
"active": {active},
"user_type": "STANDARD",
"language": "en_US",
"locale": "en_US",
"utcOffset": -28800000,
"updated_at": "2017-10-05T20:39:02.000+0000",
"is_app_installed": {is_app_installed}
}}
"""

View File

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

View File

@@ -0,0 +1,39 @@
import requests
from allauth.socialaccount.providers.oauth2.views import (
OAuth2Adapter,
OAuth2CallbackView,
OAuth2LoginView,
)
from .provider import SalesforceProvider
class SalesforceOAuth2Adapter(OAuth2Adapter):
provider_id = SalesforceProvider.id
@property
def base_url(self):
return self.get_provider().app.key
@property
def authorize_url(self):
return "{}/services/oauth2/authorize".format(self.base_url)
@property
def access_token_url(self):
return "{}/services/oauth2/token".format(self.base_url)
@property
def userinfo_url(self):
return "{}/services/oauth2/userinfo".format(self.base_url)
def complete_login(self, request, app, token, **kwargs):
resp = requests.get(self.userinfo_url, params={"oauth_token": token})
resp.raise_for_status()
extra_data = resp.json()
return self.get_provider().sociallogin_from_response(request, extra_data)
oauth2_login = OAuth2LoginView.adapter_view(SalesforceOAuth2Adapter)
oauth2_callback = OAuth2CallbackView.adapter_view(SalesforceOAuth2Adapter)