Ejemplo n.º 1
0
def callback():
    if current_user is not None and current_user.is_authenticated:
        return redirect(url_for('main.home'))
    if 'error' in request.args:
        if request.args.get('error') == 'access_denied':
            flash('You denied access.', 'danger')
        else:
            flash('Error occured', 'danger')
        return redirect(url_for('users.login'))
    if 'code' not in request.args or 'state' not in request.args:
        flash('Error Occurred! Please try again.')
        return redirect(url_for('users.login'))
    else:
        print()
        print('code: ', request.args.get('code'))
        print('request.url: ', request.url)
        print()

    oauth = get_google_auth(state=session['oauth_state'])
    try:
        token = oauth.fetch_token(Auth.TOKEN_URI,
                                  client_secret=Auth.CLIENT_SECRET,
                                  authorization_response=request.url)
    except Exception as e:
        print("Error: ", e)
        flash('Error Occurred while getting access token', 'danger')
        return redirect(url_for('users.login'))
    resp = oauth.get(Auth.USER_INFO)
    if resp.status_code == 200:
        user_data = resp.json()
        email = user_data['email']
        # print()
        # print(user_data)
        # print('Name: ',user_data['name'])
        # print('Email: ',user_data['email'])
        # print('Picture link: ',user_data['picture'])
        # print()

        user = User.query.filter_by(email=email).first()
        if user is not None:
            if user.login_using != 'Google':
                flash(
                    f'You have not used Google to login before. Please use email and password to login!',
                    'danger')
                return redirect(url_for('users.login'))
            flash(f'Welcome back, {user.username}.', 'success')
            user.login_using = 'Google'
        else:
            user = User()
            user.username = username_from_email(email, User)
            user.first_name = user_data['given_name']
            user.last_name = user_data['family_name']
            user.email = email
            user.avatar_link = user_data['picture']
            user.image_file = save_picture_from_url(user_data['picture'])
            user.tokens = json.dumps(token)
            user.login_using = 'Google'
            flash(f'Welcome, {user.username}.', 'success')
        db.session.add(user)
        db.session.commit()
        login_user(user)
        return redirect(url_for('main.home'))
    else:
        flash('Could not fetch your information', 'danger')
        return redirect(url_for('users.login'))