from urllib.parse import urlencode import structlog from flask import current_app, redirect, session from werkzeug import Response from delphi_slz_admin.const import APP_NAME from delphi_slz_admin.services.config import Config logger = structlog.get_logger(APP_NAME) def login() -> Response: logger.debug('Redirecting for authorization') config: Config = current_app.config['CONFIG'] return current_app.auth0.authorize_redirect(redirect_uri=f'{config.app_base_url}/callback') def callback() -> Response: current_app.auth0.authorize_access_token() resp = current_app.auth0.get('userinfo') userinfo = resp.json() logger.debug('User info received, updating session: %s', userinfo) session['jwt_payload'] = userinfo session['profile'] = { 'user_id': userinfo['sub'], 'name': userinfo['name'], 'picture': userinfo['picture'] } return redirect('/') def logout() -> Response: user_id = session.get('profile', {}).get('user_id') logger.debug('Clearing session and redirecting for logout: user_id = %s', user_id) session.clear() config: Config = current_app.config['CONFIG'] params = { 'returnTo': f'{config.app_base_url}/', 'client_id': current_app.auth0.client_id, } return redirect(f'{current_app.auth0.api_base_url}/v2/logout?{urlencode(params)}')