Revision 0e79735c
b/snf-astakos-app/astakos/im/auth_providers.py | ||
---|---|---|
99 | 99 |
def add_url(self): |
100 | 100 |
return reverse(self.login_view) |
101 | 101 |
|
102 |
def __init__(self, user=None): |
|
102 |
@property |
|
103 |
def provider_details(self): |
|
104 |
if self.user: |
|
105 |
if self.identifier: |
|
106 |
self._provider_details = \ |
|
107 |
self.user.get_auth_providers().get(module=self.module, |
|
108 |
identifier=self.identifier).__dict__ |
|
109 |
else: |
|
110 |
self._provider_details = self.user.get(module=self.module).__dict__ |
|
111 |
return self._provider_details |
|
112 |
|
|
113 |
def __init__(self, user=None, identifier=None, provider_details=None): |
|
103 | 114 |
self.user = user |
115 |
self.identifier = identifier |
|
116 |
|
|
117 |
self._provider_details = None |
|
118 |
if provider_details: |
|
119 |
self._provider_details = provider_details |
|
120 |
|
|
104 | 121 |
for tpl in ['login_prompt', 'login', 'signup_prompt']: |
105 | 122 |
tpl_name = '%s_%s' % (tpl, 'template') |
106 | 123 |
override = self.get_setting(tpl_name) |
... | ... | |
254 | 271 |
login_prompt_template = 'im/auth/third_party_provider_generic_login_prompt.html' |
255 | 272 |
|
256 | 273 |
|
257 |
def get_provider(id, user_obj=None, default=None): |
|
274 |
def get_provider(id, user_obj=None, default=None, identifier=None, provider_details={}):
|
|
258 | 275 |
""" |
259 | 276 |
Return a provider instance from the auth providers registry. |
260 | 277 |
""" |
261 | 278 |
if not id in PROVIDERS: |
262 | 279 |
raise Exception('Invalid auth provider requested "%s"' % id) |
263 | 280 |
|
264 |
return PROVIDERS.get(id, default)(user_obj) |
|
281 |
return PROVIDERS.get(id, default)(user_obj, identifier, provider_details)
|
|
265 | 282 |
|
b/snf-astakos-app/astakos/im/messages.py | ||
---|---|---|
207 | 207 |
AUTH_PROVIDER_INVALID_LOGIN = "No account exists." |
208 | 208 |
AUTH_PROVIDER_REQUIRED = "%(provider)s login method is required. Add one from your profile page." |
209 | 209 |
AUTH_PROVIDER_CANNOT_CHANGE_PASSWORD = "Changing password is not supported." |
210 |
AUTH_PROVIDER_SIGNUP_FROM_LOGIN = None |
|
210 | 211 |
|
211 | 212 |
EXISTING_EMAIL_THIRD_PARTY_NOTIFICATION = "You can add '%s' login method to your existing account from your " \ |
212 | 213 |
" <a href='%s'>profile page</a>" |
b/snf-astakos-app/astakos/im/models.py | ||
---|---|---|
601 | 601 |
if 'identifier' in kwargs: |
602 | 602 |
try: |
603 | 603 |
# provider with specified params already exist |
604 |
print "LALALALA", include_unverified |
|
604 | 605 |
if not include_unverified: |
605 | 606 |
kwargs['user__email_verified'] = True |
606 | 607 |
existing_user = AstakosUser.objects.get_auth_provider_user(provider, |
b/snf-astakos-app/astakos/im/target/__init__.py | ||
---|---|---|
46 | 46 |
from astakos.im.views import requires_anonymous, render_response |
47 | 47 |
|
48 | 48 |
|
49 |
def init_third_party_session(request): |
|
50 |
params = dict(request.GET.items()) |
|
51 |
request.session['third_party_request_params'] = params |
|
52 |
|
|
53 |
|
|
54 |
def get_third_party_session_params(request): |
|
55 |
if 'third_party_request_params' in request.session: |
|
56 |
params = request.session['third_party_request_params'] |
|
57 |
del request.session['third_party_request_params'] |
|
58 |
return params |
|
59 |
return {} |
|
60 |
|
|
61 |
|
|
49 | 62 |
def add_pending_auth_provider(request, third_party_token): |
50 | 63 |
if third_party_token: |
51 | 64 |
# use requests to assign the account he just authenticated with with |
... | ... | |
58 | 71 |
|
59 | 72 |
|
60 | 73 |
def get_pending_key(request): |
61 |
third_party_token = get_query(request).get('key', False) |
|
62 |
if not third_party_token: |
|
63 |
third_party_token = request.session.get('pending_key', None) |
|
64 |
if third_party_token: |
|
65 |
del request.session['pending_key'] |
|
74 |
third_party_token = get_query(request).get('key', request.session.get('pending_key', False)) |
|
75 |
if 'pending_key' in request.session: |
|
76 |
del request.session['pending_key'] |
|
66 | 77 |
return third_party_token |
67 | 78 |
|
68 | 79 |
|
... | ... | |
115 | 126 |
|
116 | 127 |
|
117 | 128 |
def handle_third_party_login(request, provider_module, identifier, |
118 |
third_party_key=None, provider_info=None,
|
|
119 |
affiliation=None):
|
|
129 |
provider_info=None, affiliation=None,
|
|
130 |
third_party_key=None):
|
|
120 | 131 |
|
121 | 132 |
if not provider_info: |
122 | 133 |
provider_info = {} |
... | ... | |
124 | 135 |
if not affiliation: |
125 | 136 |
affiliation = provider_module.title() |
126 | 137 |
|
127 |
if not third_party_key: |
|
128 |
third_party_key = get_pending_key(request) |
|
129 |
|
|
130 | 138 |
next_redirect = request.GET.get('next', request.session.get('next_url', None)) |
131 | 139 |
if 'next_url' in request.session: |
132 | 140 |
del request.session['next_url'] |
133 | 141 |
|
142 |
third_party_request_params = get_third_party_session_params(request) |
|
143 |
from_login = third_party_request_params.get('from_login', False) |
|
144 |
|
|
134 | 145 |
# an existing user accessed the view |
135 | 146 |
if request.user.is_authenticated(): |
136 | 147 |
|
... | ... | |
153 | 164 |
return HttpResponseRedirect(reverse('edit_profile')) |
154 | 165 |
|
155 | 166 |
# astakos user exists ? |
156 |
user = AstakosUser.objects.get_auth_provider_user( |
|
157 |
provider_module, |
|
158 |
identifier=identifier |
|
159 |
) |
|
167 |
try: |
|
168 |
user = AstakosUser.objects.get_auth_provider_user( |
|
169 |
provider_module, |
|
170 |
identifier=identifier, |
|
171 |
user__email_verified=True, |
|
172 |
) |
|
173 |
except AstakosUser.DoesNotExist: |
|
174 |
# TODO: add a message ? redirec to login ? |
|
175 |
if astakos_messages.AUTH_PROVIDER_SIGNUP_FROM_LOGIN: |
|
176 |
messages.warning(request, |
|
177 |
astakos_messages.AUTH_PROVIDER_SIGNUP_FROM_LOGIN) |
|
178 |
raise |
|
179 |
|
|
180 |
if not third_party_key: |
|
181 |
third_party_key = get_pending_key(request) |
|
182 |
|
|
160 | 183 |
if user.is_active: |
161 | 184 |
# authenticate user |
162 | 185 |
response = prepare_response(request, |
b/snf-astakos-app/astakos/im/target/google.py | ||
---|---|---|
55 | 55 |
from astakos.im import settings |
56 | 56 |
from astakos.im import auth_providers |
57 | 57 |
from astakos.im.target import add_pending_auth_provider, get_pending_key, \ |
58 |
handle_third_party_signup, handle_third_party_login |
|
58 |
handle_third_party_signup, handle_third_party_login, init_third_party_session
|
|
59 | 59 |
|
60 | 60 |
import logging |
61 | 61 |
import time |
... | ... | |
89 | 89 |
@requires_auth_provider('google', login=True) |
90 | 90 |
@require_http_methods(["GET", "POST"]) |
91 | 91 |
def login(request): |
92 |
init_third_party_session(request) |
|
92 | 93 |
params = { |
93 | 94 |
'scope': token_scope, |
94 | 95 |
'response_type': 'code', |
b/snf-astakos-app/astakos/im/target/linkedin.py | ||
---|---|---|
55 | 55 |
from astakos.im import settings |
56 | 56 |
from astakos.im import auth_providers |
57 | 57 |
from astakos.im.target import add_pending_auth_provider, get_pending_key, \ |
58 |
handle_third_party_signup, handle_third_party_login |
|
58 |
handle_third_party_signup, handle_third_party_login, init_third_party_session
|
|
59 | 59 |
|
60 | 60 |
import astakos.im.messages as astakos_messages |
61 | 61 |
|
... | ... | |
77 | 77 |
@requires_auth_provider('linkedin', login=True) |
78 | 78 |
@require_http_methods(["GET", "POST"]) |
79 | 79 |
def login(request): |
80 |
init_third_party_session(request) |
|
80 | 81 |
resp, content = client.request(request_token_url, "GET") |
81 | 82 |
if resp['status'] != '200': |
82 | 83 |
messages.error(request, 'Invalid linkedin response') |
b/snf-astakos-app/astakos/im/target/shibboleth.py | ||
---|---|---|
55 | 55 |
from astakos.im import auth_providers |
56 | 56 |
from astakos.im import settings |
57 | 57 |
from astakos.im.target import add_pending_auth_provider, get_pending_key, \ |
58 |
handle_third_party_signup, handle_third_party_login |
|
58 |
handle_third_party_signup, handle_third_party_login, init_third_party_session
|
|
59 | 59 |
|
60 | 60 |
import astakos.im.messages as astakos_messages |
61 | 61 |
import logging |
... | ... | |
82 | 82 |
template='im/third_party_check_local.html', |
83 | 83 |
extra_context=None): |
84 | 84 |
|
85 |
init_third_party_session(request) |
|
85 | 86 |
extra_context = extra_context or {} |
86 | 87 |
|
87 | 88 |
tokens = request.META |
b/snf-astakos-app/astakos/im/target/twitter.py | ||
---|---|---|
56 | 56 |
from astakos.im import settings |
57 | 57 |
from astakos.im import auth_providers |
58 | 58 |
from astakos.im.target import add_pending_auth_provider, get_pending_key, \ |
59 |
handle_third_party_signup, handle_third_party_login |
|
59 |
handle_third_party_signup, handle_third_party_login, init_third_party_session
|
|
60 | 60 |
|
61 | 61 |
import astakos.im.messages as astakos_messages |
62 | 62 |
|
... | ... | |
77 | 77 |
@requires_auth_provider('twitter', login=True) |
78 | 78 |
@require_http_methods(["GET", "POST"]) |
79 | 79 |
def login(request): |
80 |
init_third_party_session(request) |
|
80 | 81 |
force_login = request.GET.get('force_login', |
81 | 82 |
settings.TWITTER_AUTH_FORCE_LOGIN) |
82 | 83 |
resp, content = client.request(request_token_url, "GET") |
... | ... | |
142 | 143 |
|
143 | 144 |
|
144 | 145 |
try: |
145 |
return handle_third_party_login(request, 'google', userid,
|
|
146 |
return handle_third_party_login(request, 'twitter', userid,
|
|
146 | 147 |
provider_info, affiliation) |
147 | 148 |
except AstakosUser.DoesNotExist, e: |
148 | 149 |
third_party_key = get_pending_key(request) |
b/snf-astakos-app/astakos/im/templates/im/auth/third_party_provider_generic_login.html | ||
---|---|---|
1 | 1 |
{% load astakos_tags %} |
2 |
<h2><a href="{% provider_login_url provider %}"> |
|
2 |
<h2><a href="{% provider_login_url provider 1 %}">
|
|
3 | 3 |
{{ provider.get_primary_login_prompt_display|safe }} {{ provider.get_title_display }} |
4 | 4 |
</a></h2> |
b/snf-astakos-app/astakos/im/templates/im/auth/third_party_provider_generic_login_prompt.html | ||
---|---|---|
1 | 1 |
{% load astakos_tags %} |
2 |
|
|
3 |
<a href="{% provider_login_url provider %}" alt="{{ provider.get_title_display }}" class="icons"><img src="{{ provider.get_icon_url_display }}" alt="{{ provider.get_title_display }}" /></a>
|
|
2 |
<a href="{% provider_login_url provider 1 %}" alt="{{ provider.get_title_display }}" class="icons"> |
|
3 |
<img src="{{ provider.get_icon_url_display }}" alt="{{ provider.get_title_display }}" /></a> |
|
4 | 4 |
|
b/snf-astakos-app/astakos/im/templatetags/astakos_tags.py | ||
---|---|---|
183 | 183 |
|
184 | 184 |
@register.tag(name="provider_login_url") |
185 | 185 |
@basictag(takes_context=True) |
186 |
def provider_login_url(context, provider): |
|
186 |
def provider_login_url(context, provider, from_login=False):
|
|
187 | 187 |
request = context['request'].REQUEST |
188 | 188 |
next = request.get('next', None) |
189 | 189 |
code = request.get('code', None) |
... | ... | |
196 | 196 |
attrs['code'] = code |
197 | 197 |
if key: |
198 | 198 |
attrs['key'] = key |
199 |
if from_login: |
|
200 |
attrs['from_login'] = 1 |
|
199 | 201 |
|
200 | 202 |
url = provider.add_url |
201 | 203 |
|
Also available in: Unified diff