Skip to content

Commit 7c6657f

Browse files
committed
refactor(socialaccount): Distinguish default scope vs request
1 parent 0599d51 commit 7c6657f

File tree

18 files changed

+80
-51
lines changed

18 files changed

+80
-51
lines changed

allauth/socialaccount/providers/authentiq/provider.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class AuthentiqProvider(OAuth2Provider):
6161
account_class = AuthentiqAccount
6262
oauth2_adapter_class = AuthentiqOAuth2Adapter
6363

64-
def get_scope(self, request):
65-
scope = set(super(AuthentiqProvider, self).get_scope(request))
64+
def get_scope_from_request(self, request):
65+
scope = set(super().get_scope_from_request(request))
6666
scope.add("openid")
6767

6868
if Scope.EMAIL in scope:
@@ -82,8 +82,8 @@ def get_default_scope(self):
8282
scope.append(Scope.EMAIL)
8383
return scope
8484

85-
def get_auth_params(self, request, action):
86-
ret = super(AuthentiqProvider, self).get_auth_params(request, action)
85+
def get_auth_params_from_request(self, request, action):
86+
ret = super().get_auth_params_from_request(request, action)
8787
if action == AuthAction.REAUTHENTICATE:
8888
ret["prompt"] = "select_account"
8989
return ret

allauth/socialaccount/providers/authentiq/tests.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ def test_default_scopes_email(self):
4545

4646
def test_scopes(self):
4747
request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)
48-
scopes = self.provider.get_scope(request)
48+
scopes = self.provider.get_scope_from_request(request)
4949
self.assertIn("openid", scopes)
5050
self.assertIn("aq:name", scopes)
5151

5252
def test_dynamic_scopes(self):
5353
request = RequestFactory().get(
5454
AuthentiqOAuth2Adapter.authorize_url, dict(scope="foo")
5555
)
56-
scopes = self.provider.get_scope(request)
56+
scopes = self.provider.get_scope_from_request(request)
5757
self.assertIn("openid", scopes)
5858
self.assertIn("aq:name", scopes)
5959
self.assertIn("foo", scopes)
@@ -65,7 +65,7 @@ def test_dynamic_scopes(self):
6565
)
6666
def test_scopes_required_verified_email(self):
6767
request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)
68-
scopes = self.provider.get_scope(request)
68+
scopes = self.provider.get_scope_from_request(request)
6969
self.assertIn("email~rs", scopes)
7070
self.assertNotIn("email", scopes)
7171

@@ -76,7 +76,7 @@ def test_scopes_required_verified_email(self):
7676
)
7777
def test_scopes_optional_verified_email(self):
7878
request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)
79-
scopes = self.provider.get_scope(request)
79+
scopes = self.provider.get_scope_from_request(request)
8080
self.assertIn("email~s", scopes)
8181
self.assertNotIn("email", scopes)
8282

@@ -87,7 +87,7 @@ def test_scopes_optional_verified_email(self):
8787
)
8888
def test_scopes_required_email(self):
8989
request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)
90-
scopes = self.provider.get_scope(request)
90+
scopes = self.provider.get_scope_from_request(request)
9191
self.assertIn("email~r", scopes)
9292
self.assertNotIn("email", scopes)
9393

@@ -98,5 +98,5 @@ def test_scopes_required_email(self):
9898
)
9999
def test_scopes_optional_email(self):
100100
request = RequestFactory().get(AuthentiqOAuth2Adapter.authorize_url)
101-
scopes = self.provider.get_scope(request)
101+
scopes = self.provider.get_scope_from_request(request)
102102
self.assertIn("email", scopes)

allauth/socialaccount/providers/basecamp/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class BasecampProvider(OAuth2Provider):
2020
account_class = BasecampAccount
2121
oauth2_adapter_class = BasecampOAuth2Adapter
2222

23-
def get_auth_params(self, request, action):
24-
data = super(BasecampProvider, self).get_auth_params(request, action)
23+
def get_auth_params_from_request(self, request, action):
24+
data = super().get_auth_params_from_request(request, action)
2525
data["type"] = "web_server"
2626
return data
2727

allauth/socialaccount/providers/cilogon/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ def get_default_scope(self):
3030
scope.append(Scope.EMAIL)
3131
return scope
3232

33-
def get_auth_params(self, request, action):
34-
ret = super(CILogonProvider, self).get_auth_params(request, action)
33+
def get_auth_params_from_request(self, request, action):
34+
ret = super().get_auth_params_from_request(request, action)
3535
if action == AuthAction.REAUTHENTICATE:
3636
ret["prompt"] = "select_account consent"
3737
return ret

allauth/socialaccount/providers/facebook/provider.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ def get_fields(self):
116116
]
117117
return settings.get("FIELDS", default_fields)
118118

119-
def get_auth_params(self, request, action):
120-
ret = super(FacebookProvider, self).get_auth_params(request, action)
119+
def get_auth_params_from_request(self, request, action):
120+
ret = super().get_auth_params_from_request(request, action)
121121
if action == AuthAction.REAUTHENTICATE:
122122
ret["auth_type"] = "reauthenticate"
123123
elif action == AuthAction.REREQUEST:
@@ -131,8 +131,8 @@ def get_init_params(self, request, app):
131131
return init_params
132132

133133
def get_fb_login_options(self, request):
134-
ret = self.get_auth_params(request, "authenticate")
135-
ret["scope"] = ",".join(self.get_scope(request))
134+
ret = self.get_auth_params_from_request(request, "authenticate")
135+
ret["scope"] = ",".join(self.get_scope_from_request(request))
136136
if ret.get("auth_type") == "reauthenticate":
137137
ret["auth_nonce"] = self.get_nonce(request, or_create=True)
138138
return ret

allauth/socialaccount/providers/flickr/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ def get_default_scope(self):
3535
scope = []
3636
return scope
3737

38-
def get_auth_params(self, request, action):
39-
ret = super(FlickrProvider, self).get_auth_params(request, action)
38+
def get_auth_params_from_request(self, request, action):
39+
ret = super().get_auth_params_from_request(request, action)
4040
if "perms" not in ret:
4141
ret["perms"] = "read"
4242
return ret

allauth/socialaccount/providers/google/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ def get_default_scope(self):
6363
scope.append(Scope.EMAIL)
6464
return scope
6565

66-
def get_auth_params(self, request, action):
67-
ret = super(GoogleProvider, self).get_auth_params(request, action)
66+
def get_auth_params_from_request(self, request, action):
67+
ret = super().get_auth_params_from_request(request, action)
6868
if action == AuthAction.REAUTHENTICATE:
6969
ret["prompt"] = "select_account consent"
7070
return ret

allauth/socialaccount/providers/microsoft/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def get_default_scope(self):
2727
"""
2828
return ["User.Read"]
2929

30-
def get_auth_params(self, request, action):
31-
ret = super(MicrosoftGraphProvider, self).get_auth_params(request, action)
30+
def get_auth_params_from_request(self, request, action):
31+
ret = super().get_auth_params_from_request(request, action)
3232
if action == AuthAction.REAUTHENTICATE:
3333
ret["prompt"] = "select_account"
3434
return ret

allauth/socialaccount/providers/oauth/provider.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def get_login_url(self, request, **kwargs):
1313
url = url + "?" + urlencode(kwargs)
1414
return url
1515

16-
def get_auth_params(self, request, action):
16+
def get_auth_params_from_request(self, request, action):
1717
settings = self.get_settings()
1818
ret = dict(settings.get("AUTH_PARAMS", {}))
1919
dynamic_auth_params = request.GET.get("auth_params", None)
@@ -27,7 +27,10 @@ def get_auth_url(self, request, action):
2727
# adapter/provider is a bit too thin here.
2828
return None
2929

30-
def get_scope(self, request):
30+
def get_scope_from_request(self, request):
31+
return self.get_scope()
32+
33+
def get_scope(self):
3134
settings = self.get_settings()
3235
scope = settings.get("SCOPE")
3336
if scope is None:

allauth/socialaccount/providers/oauth/views.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def view(request, *args, **kwargs):
5252
def _get_client(self, request, callback_url):
5353
provider = self.adapter.get_provider()
5454
app = provider.app
55-
scope = " ".join(provider.get_scope(request))
55+
scope = " ".join(provider.get_scope_from_request(request))
5656
parameters = {}
5757
if scope:
5858
parameters["scope"] = scope
@@ -76,7 +76,7 @@ def login(self, request, *args, **kwargs):
7676
action = request.GET.get("action", AuthAction.AUTHENTICATE)
7777
provider = self.adapter.get_provider()
7878
auth_url = provider.get_auth_url(request, action) or self.adapter.authorize_url
79-
auth_params = provider.get_auth_params(request, action)
79+
auth_params = provider.get_auth_params_from_request(request, action)
8080
client = self._get_client(request, callback_url)
8181
try:
8282
return client.get_redirect(auth_url, auth_params)

allauth/socialaccount/providers/oauth2/provider.py

+35-9
Original file line numberDiff line numberDiff line change
@@ -40,54 +40,80 @@ def get_pkce_params(self):
4040
return pkce_code_params
4141
return {}
4242

43-
def get_auth_params(self, request, action):
43+
def get_auth_params(self):
4444
"""
4545
Returns a dictionary of additional parameters passed to the OAuth2
4646
redirect URL. Additional -- so no need to pass the standard `client_id`,
4747
`redirect_uri`, `response_type`.
4848
"""
4949
settings = self.get_settings()
5050
ret = dict(settings.get("AUTH_PARAMS", {}))
51+
return ret
52+
53+
def get_auth_params_from_request(self, request, action):
54+
"""
55+
Returns a dictionary of additional parameters passed to the OAuth2
56+
redirect URL. Additional -- so no need to pass the standard `client_id`,
57+
`redirect_uri`, `response_type`.
58+
"""
59+
ret = self.get_auth_params()
5160
dynamic_auth_params = request.GET.get("auth_params", None)
5261
if dynamic_auth_params:
5362
ret.update(dict(parse_qsl(dynamic_auth_params)))
5463
return ret
5564

56-
def get_scope(self, request):
65+
def get_default_scope(self):
66+
"""
67+
Returns the default scope to use.
68+
"""
69+
return []
70+
71+
def get_scope(self):
72+
"""
73+
Returns the scope to use, taking settings `SCOPE` into consideration.
74+
"""
5775
settings = self.get_settings()
5876
scope = list(settings.get("SCOPE", self.get_default_scope()))
77+
return scope
78+
79+
def get_scope_from_request(self, request):
80+
"""
81+
Returns the scope to use for the given request.
82+
"""
83+
scope = self.get_scope()
5984
dynamic_scope = request.GET.get("scope", None)
6085
if dynamic_scope:
6186
scope.extend(dynamic_scope.split(","))
6287
return scope
6388

64-
def get_default_scope(self):
65-
return []
66-
6789
def get_oauth2_adapter(self, request):
6890
return self.oauth2_adapter_class(request)
6991

7092
def get_redirect_from_request_kwargs(self, request):
7193
kwargs = super().get_redirect_from_request_kwargs(request)
72-
kwargs["scope"] = self.get_scope(request)
94+
kwargs["scope"] = self.get_scope_from_request(request)
7395
action = request.GET.get("action", AuthAction.AUTHENTICATE)
74-
kwargs["auth_params"] = self.get_auth_params(request, action)
96+
kwargs["auth_params"] = self.get_auth_params_from_request(request, action)
7597
return kwargs
7698

7799
def redirect(self, request, process, next_url=None, data=None, **kwargs):
78100
app = self.app
79101
oauth2_adapter = self.get_oauth2_adapter(request)
80102
client = oauth2_adapter.get_client(request, app)
81103
auth_url = oauth2_adapter.authorize_url
82-
auth_params = kwargs["auth_params"]
104+
auth_params = kwargs.get("auth_params")
105+
if auth_params is None:
106+
auth_params = self.get_auth_params()
83107
pkce_params = self.get_pkce_params()
84108
code_verifier = pkce_params.pop("code_verifier", None)
85109
auth_params.update(pkce_params)
86110
if code_verifier:
87111
request.session["pkce_code_verifier"] = code_verifier
88112

89113
client.state = self.stash_redirect_state(request, process, next_url, data)
90-
scope = kwargs["scope"]
114+
scope = kwargs.get("scope")
115+
if scope is None:
116+
scope = self.get_scope()
91117
try:
92118
return HttpResponseRedirect(
93119
client.get_redirect_url(auth_url, scope, auth_params)

allauth/socialaccount/providers/pocket/views.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class PocketOAuthLoginView(OAuthLoginView):
1717
def _get_client(self, request, callback_url):
1818
provider = self.adapter.get_provider()
1919
app = provider.app
20-
scope = " ".join(provider.get_scope(request))
20+
scope = " ".join(provider.get_scope_from_request(request))
2121
parameters = {}
2222
if scope:
2323
parameters["scope"] = scope
@@ -38,7 +38,7 @@ class PocketOAuthCallbackView(OAuthCallbackView):
3838
def _get_client(self, request, callback_url):
3939
provider = self.adapter.get_provider()
4040
app = provider.app
41-
scope = " ".join(provider.get_scope(request))
41+
scope = " ".join(provider.get_scope_from_request(request))
4242
parameters = {}
4343
if scope:
4444
parameters["scope"] = scope

allauth/socialaccount/providers/salesforce/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class SalesforceProvider(OAuth2Provider):
2929
def get_default_scope(self):
3030
return ["id", "openid"]
3131

32-
def get_auth_params(self, request, action):
33-
ret = super(SalesforceProvider, self).get_auth_params(request, action)
32+
def get_auth_params_from_request(self, request, action):
33+
ret = super().get_auth_params_from_request(request, action)
3434
if action == AuthAction.REAUTHENTICATE:
3535
ret["approval_prompt"] = "force"
3636
return ret

allauth/socialaccount/providers/shopify/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def is_per_user(self):
2525
)
2626
return grant_options.lower().strip() == "per-user"
2727

28-
def get_auth_params(self, request, action):
29-
ret = super(ShopifyProvider, self).get_auth_params(request, action)
28+
def get_auth_params_from_request(self, request, action):
29+
ret = super().get_auth_params_from_request(request, action)
3030
shop = request.GET.get("shop", None)
3131
if shop:
3232
ret.update({"shop": shop})

allauth/socialaccount/providers/trainingpeaks/tests.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def test_use_production_uri(self):
6565
def test_scope_from_default(self):
6666
Request = namedtuple("request", ["GET"])
6767
mock_request = Request(GET={})
68-
scope = self.provider.get_scope(mock_request)
68+
scope = self.provider.get_scope_from_request(mock_request)
6969
self.assertTrue("athlete:profile" in scope)
7070

7171
@override_settings(
@@ -76,6 +76,6 @@ def test_scope_from_default(self):
7676
def test_scope_from_settings(self):
7777
Request = namedtuple("request", ["GET"])
7878
mock_request = Request(GET={})
79-
scope = self.provider.get_scope(mock_request)
79+
scope = self.provider.get_scope_from_request(mock_request)
8080
for item in ("athlete:profile", "workouts", "workouts:wod"):
8181
self.assertTrue(item in scope)

allauth/socialaccount/providers/trello/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ def extract_common_fields(self, data):
2828
name=data.get("name"),
2929
)
3030

31-
def get_auth_params(self, request, action):
32-
data = super(TrelloProvider, self).get_auth_params(request, action)
31+
def get_auth_params_from_request(self, request, action):
32+
data = super().get_auth_params_from_request(request, action)
3333
data["type"] = "web_server"
3434
data["name"] = self.app.name
3535
# define here for how long it will be, this can be configured on the

allauth/socialaccount/providers/untappd/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class UntappdProvider(OAuth2Provider):
2424
account_class = UntappdAccount
2525
oauth2_adapter_class = UntappdOAuth2Adapter
2626

27-
def get_auth_params(self, request, action):
28-
params = super(UntappdProvider, self).get_auth_params(request, action)
27+
def get_auth_params_from_request(self, request, action):
28+
params = super().get_auth_params_from_request(request, action)
2929
# Untappd uses redirect_url instead of redirect_uri
3030
params["redirect_url"] = request.build_absolute_uri(
3131
reverse(self.id + "_callback")

allauth/socialaccount/providers/ynab/provider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def get_default_scope(self):
2121
scope = [Scope.ACCESS]
2222
return scope
2323

24-
def get_auth_params(self, request, action):
25-
ret = super(YNABProvider, self).get_auth_params(request, action)
24+
def get_auth_params_from_request(self, request, action):
25+
ret = super().get_auth_params_from_request(request, action)
2626
if action == AuthAction.REAUTHENTICATE:
2727
ret["prompt"] = "select_account consent"
2828
return ret

0 commit comments

Comments
 (0)