Skip to content

Commit 790cea0

Browse files
committed
feat: allow to override OAuth2 URLs in settings
This allows to use the backends with other than hardcoded URLs easily. Fixes #893
1 parent 41ac4ee commit 790cea0

File tree

15 files changed

+50
-59
lines changed

15 files changed

+50
-59
lines changed

social_core/backends/azuread.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ def tenant_id(self) -> str:
6868
return "common"
6969

7070
@property
71-
def base_url(self):
71+
def base_url(self) -> str:
7272
return self.BASE_URL.format(
7373
authority_host=self.authority_host, tenant_id=self.tenant_id
7474
)
7575

76-
def authorization_url(self):
77-
return self.AUTHORIZATION_URL.format(base_url=self.base_url)
76+
def get_authorization_url_format(self) -> dict[str, str]:
77+
return {"base_url": self.base_url}
7878

79-
def access_token_url(self):
80-
return self.ACCESS_TOKEN_URL.format(base_url=self.base_url)
79+
def get_access_token_url_format(self) -> dict[str, str]:
80+
return {"base_url": self.base_url}
8181

8282
def get_user_id(self, details, response):
8383
"""Use upn as unique id"""

social_core/backends/azuread_b2c.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,10 @@ def openid_configuration_url(self):
101101
base_url=self.base_url, policy=self.policy
102102
)
103103

104-
def authorization_url(self):
105-
# Policy is required, but added later by `auth_extra_arguments()`
106-
return self.AUTHORIZATION_URL.format(base_url=self.base_url)
107-
108-
def access_token_url(self):
109-
return self.ACCESS_TOKEN_URL.format(base_url=self.base_url, policy=self.policy)
104+
def get_access_token_url_format(self) -> dict[str, str]:
105+
params = super().get_access_token_url_format()
106+
params["policy"] = self.policy
107+
return params
110108

111109
def jwks_url(self):
112110
return self.JWKS_URL.format(base_url=self.base_url, policy=self.policy)

social_core/backends/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def log_debug(self, message, *args) -> None:
4141
def log_warning(self, message, *args) -> None:
4242
social_logger.warning(f"{self.name}: {message}", *args)
4343

44-
def setting(self, name, default=None):
44+
def setting(self, name: str, default=None):
4545
"""Return setting value from strategy"""
4646
return self.strategy.setting(name, default=default, backend=self)
4747

social_core/backends/facebook.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,11 @@ def auth_params(self, state=None):
4747
params["return_scopes"] = "true"
4848
return params
4949

50-
def authorization_url(self):
51-
version = self.setting("API_VERSION", API_VERSION)
52-
return self.AUTHORIZATION_URL.format(version=version)
50+
def get_authorization_url_format(self) -> dict[str, str]:
51+
return {"version": self.setting("API_VERSION", API_VERSION)}
5352

54-
def access_token_url(self):
55-
version = self.setting("API_VERSION", API_VERSION)
56-
return self.ACCESS_TOKEN_URL.format(version=version)
53+
def get_access_token_url_format(self) -> dict[str, str]:
54+
return {"version": self.setting("API_VERSION", API_VERSION)}
5755

5856
def get_user_details(self, response):
5957
"""Return user details from Facebook account"""

social_core/backends/google.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def auth_complete(self, *args, **kwargs):
115115
return self.do_auth(token, *args, response=response, **kwargs)
116116
if "code" in self.data: # Server-side workflow
117117
response = self.request_access_token(
118-
self.ACCESS_TOKEN_URL,
118+
self.access_token_url(),
119119
data=self.auth_complete_params(),
120120
headers=self.auth_headers(),
121121
method=self.ACCESS_TOKEN_METHOD,

social_core/backends/keycloak.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,6 @@ class KeycloakOAuth2(BaseOAuth2): # pylint: disable=abstract-method
9999
ID_KEY = "username"
100100
REDIRECT_STATE = False
101101

102-
def authorization_url(self):
103-
return self.setting("AUTHORIZATION_URL")
104-
105-
def access_token_url(self):
106-
return self.setting("ACCESS_TOKEN_URL")
107-
108102
def audience(self):
109103
return self.setting("KEY")
110104

social_core/backends/mineid.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ class MineIDOAuth2(BaseOAuth2):
55
"""MineID OAuth2 authentication backend"""
66

77
name = "mineid"
8-
_AUTHORIZATION_URL = "%(scheme)s://%(host)s/oauth/authorize"
9-
_ACCESS_TOKEN_URL = "%(scheme)s://%(host)s/oauth/access_token"
8+
AUTHORIZATION_URL = "{scheme}://{host}/oauth/authorize"
9+
ACCESS_TOKEN_URL = "{scheme}://{host}/oauth/access_token"
1010
SCOPE_SEPARATOR = ","
1111
EXTRA_DATA = []
1212

@@ -21,15 +21,13 @@ def _user_data(self, access_token, path=None):
2121
url = "{scheme}://{host}/api/user".format(**self.get_mineid_url_params())
2222
return self.get_json(url, params={"access_token": access_token})
2323

24-
@property
25-
def AUTHORIZATION_URL(self):
26-
return self._AUTHORIZATION_URL % self.get_mineid_url_params()
24+
def get_authorization_url_format(self) -> dict[str, str]:
25+
return self.get_mineid_url_params()
2726

28-
@property
29-
def ACCESS_TOKEN_URL(self):
30-
return self._ACCESS_TOKEN_URL % self.get_mineid_url_params()
27+
def get_access_token_url_format(self) -> dict[str, str]:
28+
return self.get_mineid_url_params()
3129

32-
def get_mineid_url_params(self):
30+
def get_mineid_url_params(self) -> dict[str, str]:
3331
return {
3432
"host": self.setting("HOST", "www.mineid.org"),
3533
"scheme": self.setting("SCHEME", "https"),

social_core/backends/nationbuilder.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class NationBuilderOAuth2(BaseOAuth2):
1616
SCOPE_SEPARATOR = ","
1717
EXTRA_DATA = [("id", "id"), ("expires", "expires")]
1818

19-
def authorization_url(self):
20-
return self.AUTHORIZATION_URL.format(slug=self.slug)
19+
def get_authorization_url_format(self) -> dict[str, str]:
20+
return {"slug": self.slug}
2121

22-
def access_token_url(self):
23-
return self.ACCESS_TOKEN_URL.format(slug=self.slug)
22+
def get_access_token_url_format(self) -> dict[str, str]:
23+
return {"slug": self.slug}
2424

2525
@property
2626
def slug(self):

social_core/backends/oauth.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,25 @@ def user_data(self, access_token, *args, **kwargs) -> dict[str, Any] | None:
147147
return {}
148148

149149
def authorization_url(self) -> str:
150-
return self.AUTHORIZATION_URL
150+
url = self.setting("AUTHORIZATION_URL", self.AUTHORIZATION_URL)
151+
if format_params := self.get_authorization_url_format():
152+
return url.format(**format_params)
153+
return url
154+
155+
def get_authorization_url_format(self) -> dict[str, str]:
156+
return {}
151157

152158
def access_token_url(self) -> str:
153-
return self.ACCESS_TOKEN_URL
159+
url = self.setting("ACCESS_TOKEN_URL", self.ACCESS_TOKEN_URL)
160+
if format_params := self.get_access_token_url_format():
161+
return url.format(**format_params)
162+
return url
163+
164+
def get_access_token_url_format(self) -> dict[str, str]:
165+
return {}
154166

155167
def revoke_token_url(self, token, uid) -> str:
156-
return self.REVOKE_TOKEN_URL
168+
return self.setting("REVOKE_TOKEN_URL", self.REVOKE_TOKEN_URL)
157169

158170
def revoke_token_params(self, token, uid) -> dict[str, Any]:
159171
return {}

social_core/backends/osso.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class OssoOAuth2(BaseOAuth2):
1616
def osso_base_url(self):
1717
return self.setting("OSSO_BASE_URL", "https://demo.ossoapp.com")
1818

19-
def authorization_url(self):
20-
return self.AUTHORIZATION_URL.format(osso_base_url=self.osso_base_url)
19+
def get_authorization_url_format(self) -> dict[str, str]:
20+
return {"osso_base_url": self.osso_base_url}
2121

22-
def access_token_url(self):
23-
return self.ACCESS_TOKEN_URL.format(osso_base_url=self.osso_base_url)
22+
def get_access_token_url_format(self) -> dict[str, str]:
23+
return {"osso_base_url": self.osso_base_url}
2424

2525
def auth_params(self, state=None):
2626
client_id, _client_secret = self.get_key_and_secret()

0 commit comments

Comments
 (0)