diff --git a/pillar/api/blender_id.py b/pillar/api/blender_id.py index 4d849820..3fcc0ebb 100644 --- a/pillar/api/blender_id.py +++ b/pillar/api/blender_id.py @@ -284,3 +284,12 @@ def fetch_blenderid_user() -> dict: def setup_app(app, url_prefix): app.register_api_blueprint(blender_id, url_prefix=url_prefix) + + +def switch_user_url(next_url: str) -> str: + from urllib.parse import quote + + base_url = '%s/switch' % blender_id_endpoint() + if next_url: + return '%s?next=%s' % (base_url, quote(next_url)) + return base_url diff --git a/pillar/web/users/routes.py b/pillar/web/users/routes.py index 86fdc410..1b23492c 100644 --- a/pillar/web/users/routes.py +++ b/pillar/web/users/routes.py @@ -107,6 +107,23 @@ def logout(): return redirect('/') +@blueprint.route('/switch') +def switch(): + from pillar.api import blender_id + + # Without this URL, the Cloud will redirect to the HTTP Referrer, which is the Blender ID + # 'switch user' page. We need to explicitly send the user to the homepage to prevent this. + next_url_after_cloud_login = url_for('main.homepage') + + # Without this URL, the user will remain on the Blender ID site. We want them to come + # back to the Cloud after switching users. + next_url_after_bid_login = url_for('users.login', + next=next_url_after_cloud_login, + _external=True) + + return redirect(blender_id.switch_user_url(next_url=next_url_after_bid_login)) + + @blueprint.route('/settings/profile', methods=['GET', 'POST']) @login_required def settings_profile(): diff --git a/src/templates/layout.jade b/src/templates/layout.jade index e0ff3393..2324d889 100644 --- a/src/templates/layout.jade +++ b/src/templates/layout.jade @@ -299,6 +299,11 @@ html(lang="en") | Subscription li.divider(role="separator") | {% endif %} + li + a.navbar-item( + href="{{ url_for('users.switch') }}") + i.pi-log-out(title="Log Out") + | Not {{ current_user.full_name }}? Log in as another user li a.navbar-item( href="{{ url_for('users.logout') }}")