from flask import Blueprint, redirect, url_for, request, flash, session from flaskapp.lib.login import check_is_logged_in from flaskapp.lib.toornament import get_toornament from flaskapp.config import secret import secrets import urllib.parse bp = Blueprint('login', __name__) @bp.route('/login') def login(): # if the user is logged in, redirect him to the next-URL or to the index page if request.args.get('next'): session['next_url'] = request.args.get('next') if check_is_logged_in(): if request.args.get('next'): return redirect(request.args.get('next')) return redirect(url_for('index.index')) state = secrets.token_hex(32) session['state'] = state params = { 'response_type': 'code', 'client_id': secret['oauth_client_id'], 'redirect_uri': secret['oauth_redirect_uri'], 'state': state, 'scope': 'user:info participant:manage_participations' } url = urllib.parse.urlencode(params) url = 'https://account.toornament.com/oauth2/authorize?' + url return redirect(url) @bp.route('/oauth/toornament') def oauth_callback(): state = request.args.get('state') if state != session.get('state'): flash('Login fehlgeschlagen! - Ungültiger OAuth2 State!', 'danger') return redirect(url_for('index.index')) code = request.args.get('code') if not code: flash('Login fehlgeschlagen!') return redirect(url_for('index.index')) toornament = get_toornament(code) user_data = toornament.get_user_data() session['is_logged_in'] = True session['username'] = user_data['name'] session['user_id'] = user_data['id'] next_url = session.get('next_url') if next_url: session.pop('next_url') return redirect(next_url) return redirect(url_for('index.index')) @bp.route('/logout') def logout(): session.clear() flash('Logout erfolgreich!', 'success') return redirect(url_for('index.index'))