You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2018/08/14 19:51:46 UTC

[airavata-django-portal] 04/13: Preserving 'next' when logging in via redirect

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 5d338393d84c25004882424f37ba8843150f68e6
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Fri Aug 10 10:39:20 2018 -0400

    Preserving 'next' when logging in via redirect
---
 django_airavata/apps/auth/backends.py                          |  5 ++---
 .../apps/auth/templates/django_airavata_auth/login.html        | 10 ++++++++--
 django_airavata/apps/auth/views.py                             |  9 ++++++---
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/django_airavata/apps/auth/backends.py b/django_airavata/apps/auth/backends.py
index 17d37f0..3d7326a 100644
--- a/django_airavata/apps/auth/backends.py
+++ b/django_airavata/apps/auth/backends.py
@@ -69,18 +69,17 @@ class KeycloakBackend(object):
 
     def _get_token_and_userinfo_redirect_flow(self, request):
         authorization_code_url = request.build_absolute_uri()
-        redirect_url = request.build_absolute_uri(
-            reverse('django_airavata_auth:callback'))
         client_id = settings.KEYCLOAK_CLIENT_ID
         client_secret = settings.KEYCLOAK_CLIENT_SECRET
         token_url = settings.KEYCLOAK_TOKEN_URL
         userinfo_url = settings.KEYCLOAK_USERINFO_URL
         verify_ssl = settings.KEYCLOAK_VERIFY_SSL
         state = request.session['OAUTH2_STATE']
+        redirect_uri = request.session['OAUTH2_REDIRECT_URI']
         logger.debug("state={}".format(state))
         oauth2_session = OAuth2Session(client_id,
                                        scope='openid',
-                                       redirect_uri=redirect_url,
+                                       redirect_uri=redirect_uri,
                                        state=state)
         if hasattr(settings, 'KEYCLOAK_CA_CERTFILE'):
             oauth2_session.verify = settings.KEYCLOAK_CA_CERTFILE
diff --git a/django_airavata/apps/auth/templates/django_airavata_auth/login.html b/django_airavata/apps/auth/templates/django_airavata_auth/login.html
index ede2663..80abbee 100644
--- a/django_airavata/apps/auth/templates/django_airavata_auth/login.html
+++ b/django_airavata/apps/auth/templates/django_airavata_auth/login.html
@@ -10,8 +10,14 @@
                 <div class="card-body">
                     <h5 class="card-title">Log in with your existing organizational login</h5>
                     {% for external in options.external %}
-                    <a href="{% url 'django_airavata_auth:redirect_login' external.idp_alias %}" class="btn btn-primary btn-block mt-3">
-                        Sign in with {{ external.name }}
+                    <a
+                    {% if next %}
+                        href="{% url 'django_airavata_auth:redirect_login' external.idp_alias %}?next={{ next | urlencode }}"
+                    {% else %}
+                        href="{% url 'django_airavata_auth:redirect_login' external.idp_alias %}"
+                    {% endif %}
+                        class="btn btn-primary btn-block mt-3">
+                            Sign in with {{ external.name }}
                     </a>
                     {% endfor %}
                 </div>
diff --git a/django_airavata/apps/auth/views.py b/django_airavata/apps/auth/views.py
index 0c7f719..39f9213 100644
--- a/django_airavata/apps/auth/views.py
+++ b/django_airavata/apps/auth/views.py
@@ -21,15 +21,18 @@ def redirect_login(request, idp_alias):
     _validate_idp_alias(idp_alias)
     client_id = settings.KEYCLOAK_CLIENT_ID
     base_authorize_url = settings.KEYCLOAK_AUTHORIZE_URL
+    redirect_uri = request.build_absolute_uri(
+        reverse('django_airavata_auth:callback'))
+    if 'next' in request.GET:
+        redirect_uri += "?next=" + quote(request.GET['next'])
     oauth2_session = OAuth2Session(
-        client_id, scope='openid',
-        redirect_uri=request.build_absolute_uri(
-            reverse('django_airavata_auth:callback')))
+        client_id, scope='openid', redirect_uri=redirect_uri)
     authorization_url, state = oauth2_session.authorization_url(
         base_authorize_url)
     authorization_url += '&kc_idp_hint=' + quote(idp_alias)
     # Store state in session for later validation (see backends.py)
     request.session['OAUTH2_STATE'] = state
+    request.session['OAUTH2_REDIRECT_URI'] = redirect_uri
     return redirect(authorization_url)