Skip to content

Commit be6c7aa

Browse files
Added logut logic
1 parent 0fbe38b commit be6c7aa

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

ckanext/sso/ssoclient.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ def __init__(self):
1818
self.scope = tk.config.get("ckanext.sso.scope")
1919
self.token_url = tk.config.get("ckanext.sso.access_token_url")
2020
self.user_info_url = tk.config.get("ckanext.sso.user_info")
21+
self.logout_url = tk.config.get('ckanext.sso.logout_url')
22+
self.logout_redirect_url = tk.config.get('ckanext.sso.logout_redirect_url')
2123

2224
def get_authorize_url(self):
2325
log.debug("get_authorize_url")
@@ -42,3 +44,11 @@ def get_user_info(self, token):
4244
oauth = OAuth2Session(self.client_id, token=token)
4345
user_info = oauth.get(self.user_info_url)
4446
return user_info.json()
47+
48+
def get_logout_url(self, return_to=self.logout_redirect_url):
49+
"""Get Auth0 logout URL"""
50+
params = {'client_id': self.client_id}
51+
if return_to:
52+
params['returnTo'] = return_to
53+
from urllib.parse import urlencode
54+
return f"{self.logout_url}?{urlencode(params)}"

ckanext/sso/views.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
from ckan.plugins import toolkit as tk
88
from ckan.views.user import RequestResetView, set_repoze_user
99
from flask import Blueprint
10+
import ckan.plugins as plugins
1011

1112
import ckanext.sso.helpers as helpers
1213
from ckanext.sso.ssoclient import SSOClient
1314
from ckanext.sso.ldap_client import LDAPClient
14-
15+
from ckan.common import (
16+
_, config, g, request, current_user, logout_user, session, login_user
17+
)
1518
g = tk.g
1619

1720
log = logging.getLogger(__name__)
@@ -24,7 +27,8 @@ def before_app_request():
2427
bp, action = tk.get_endpoint()
2528
if bp == "user" and action == "login" and helpers.check_default_login():
2629
return tk.redirect_to(h.url_for("sso.sso"))
27-
30+
if bp == "user" and action == "logout":
31+
return tk.redirect_to(h.url_for('sso.sso_logout'))
2832

2933

3034

@@ -88,6 +92,12 @@ def dashboard():
8892
"fullname": userinfo["name"],
8993
"plugin_extras": {"idp": userinfo["sub"]},
9094
}
95+
picture_url = (userinfo.get('picture') or
96+
userinfo.get('avatar') or
97+
userinfo.get('image'))
98+
if picture_url:
99+
user_dict['image_url'] = picture_url
100+
91101
log.debug(f"User Info: {user_dict}")
92102
#ldap info
93103
ldap_department_num=None
@@ -178,10 +188,33 @@ def reset_password():
178188
return tk.redirect_to(tk.url_for("user.login"))
179189
return RequestResetView().post()
180190

191+
def sso_logout():
192+
for item in plugins.PluginImplementations(plugins.IAuthenticator):
193+
response = item.logout()
194+
if response:
195+
return response
196+
user = current_user.name
197+
if not user:
198+
return h.redirect_to('user.login')
199+
200+
came_from = request.args.get('came_from', '')
201+
logout_user()
202+
203+
field_name = config.get("WTF_CSRF_FIELD_NAME")
204+
if session.get(field_name):
205+
session.pop(field_name)
206+
207+
if h.url_is_local(came_from):
208+
return h.redirect_to(str(came_from))
209+
210+
logout_url = sso_client.get_logout_url()
211+
return tk.redirect_to(logout_url)
212+
181213

182214
blueprint.add_url_rule("/sso", view_func=sso)
183215
blueprint.add_url_rule("/dashboard", view_func=dashboard)
184216
blueprint.add_url_rule("/reset_password", view_func=reset_password, methods=["POST"])
217+
blueprint.add_url_rule('/sso_logout', view_func=sso_logout)
185218

186219

187220
def get_blueprint():

0 commit comments

Comments
 (0)