def twitter_authorized(response):
    next_url = request.args.get('next') or url_for('mod_feed.index')

    if not response:
        flash('You denied the request to sign in')
        return redirect(next_url)


    # Store the token so we can access it later from tokengetter
    session['twitter_oauth_token'] = (
        response['oauth_token'],
        response['oauth_token_secret'])

    twitter_user_id = response['user_id']
    twitter_screen_name = response['screen_name']

    resp = twitter.get('users/show.json',
                       data={'screen_name': twitter_screen_name})

    twitter_profile_image_url = resp.data['profile_image_url']

    # If the user is not registered, add him
    user = User.query.filter_by(email=twitter_screen_name).first()
    if not user:
        user = User(email=twitter_screen_name, register_with_provider=True)
        db.session.add(user)
        db.session.commit()

    # In any case we update the authentication token in the db
    # If the user has revoked access we will have new token here
    connection = Connection.query.filter_by(
        user_id=user.id,
        provider_id=provider_id['TWITTER']).first()

    if not connection:
        connection = Connection(
            user_id=user.id,
            provider_id=provider_id['TWITTER'],
            provider_user_id=twitter_user_id,
            display_name=twitter_screen_name,
            image_url=twitter_profile_image_url,
            user=user
        )

    connection.oauth_token = response['oauth_token'],
    connection.oauth_secret = response['oauth_token_secret'],
    db.session.add(connection)

    login_user(user)

    flash('Logged in as id = %s, name = %s, redirect = %s, image_url = %s'  % \
            (connection.provider_user_id, connection.display_name,
             twitter_profile_image_url, request.args.get('next')))

    return redirect(next_url)
def facebook_authorized(response):
    """Authorize the Facebook account.
    :param response: The response from Facebook
    """

    next_url = request.args.get('next') or url_for('mod_feed.index')

    if not response:
        flash('You denied the request to sign in')
        return redirect(next_url)

    # Store the token so we can access it later from tokengetter
    session['facebook_access_token'] = (response['access_token'], '')

    fbme = facebook.get('/me')
    email = fbme.data['email']

    # If the user is not registered, add him
    user = User.query.filter_by(email=email).first()
    if not user:
        user = User(email=email, register_with_provider=True, confirmed=True)
        db.session.add(user)
        db.session.commit()

    # In any case we update the authentication token in the db
    # If the user has revoked access we will have new token here
    connection = Connection.query.filter_by(
        user_id=user.id,
        provider_id=provider_id['FACEBOOK']).first()

    if not connection:
        connection = Connection(
            user_id=user.id,
            provider_id=provider_id['FACEBOOK'],
            provider_user_id=fbme.data['id'],
            display_name=fbme.data['name'],
            image_url='https://graph.facebook.com/%s/picture?type=large' % \
                (fbme.data['id']),
            user=user)
        db.session.add(connection)

    connection.oauth_token = response['access_token']

    # Create a `Saved` magazine
    if not Magazine.query.filter_by(name='Saved').first():
        magazine = Magazine(name='Saved', public=False, user_id=user.id)
        db.session.add(magazine)
        db.session.commit()
        user.saved_magazine = magazine.id

    login_user(user)

    return redirect(next_url)
def google_authorized(response):
    """Authorize the Google account
    :param response: The response from Google's authorization service
    """

    access_token = response['access_token']
    session['google_token'] = (access_token, '')

    headers = {'Authorization': 'OAuth '+ access_token}
    req = Request('https://www.googleapis.com/oauth2/v1/userinfo',
                  None, headers)

    try:
        res = urlopen(req)
    except URLError as err:
        if err.code == 401:
            # Unauthorized - bad token
            session.pop('google_token', None)
            flash('You denied the request to sign in')
            return redirect(url_for('mod_auth.login'))

        flash('Something bad happened when signing with Google')
        return redirect(url_for('mod_auth.login'))

    user_info = json.loads(res.read())


    user = User.query.filter_by(email=user_info['email']).first()
    if not user:
        user = User(email=user_info['email'],
                    register_with_provider=True,
                    confirmed=True)
        db.session.add(user)
        db.session.commit()

    connection = Connection.query.filter_by(
        user_id=user.id,
        provider_id=provider_id['GOOGLE']).first()

    if not connection:
        connection = Connection(
            user_id=user.id,
            provider_id=provider_id['GOOGLE'],
            provider_user_id=user_info['id'],
            display_name=user_info['name'],
            image_url=user_info['picture'],
            user=user)

    connection.oauth_token = access_token
    db.session.add(connection)

    # Create a `Saved` magazine
    if not Magazine.query.filter_by(name='Saved').first():
        magazine = Magazine(name='Saved', public=False, user_id=user.id)
        db.session.add(magazine)
        db.session.commit()
        user.saved_magazine = magazine.id

    login_user(user)

    return redirect(session.get('google_auth_next_url'))