Esempio n. 1
0
def gconnect():
    """Handles Google+ login."""

    # Validate state token
    if request.args.get('state') != login_session['state']:
        return make_json_response('Invalid state parameter', 401)

    auth_code = request.data

    try:
        # Upgrade the authorization code into a credentials object
        oauth_flow = flow_from_clientsecrets(secrets_path, scope='')
        oauth_flow.redirect_uri = 'postmessage'
        credentials = oauth_flow.step2_exchange(auth_code)
    except FlowExchangeError:
        return make_json_response(
            'Failed to upgrade the authorization code.', 401)

    # Check that the access token is valid
    access_token = credentials.access_token
    url = (
        'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=%s' %
        access_token)
    h = httplib2.Http()
    result = json.loads(h.request(url, 'GET')[1])
    if result.get('error') is not None:
        return make_json_response(result.get('error'), 500)

    # Verify that the access token is used for the intended user
    gplus_id = credentials.id_token['sub']
    if result['user_id'] != gplus_id:
        return make_json_response(
            "Token's user ID doesn't match given user ID.", 401)

    # Verify that the access token is valid for this app
    if result['issued_to'] != CLIENT_ID:
        return make_json_response(
            "Token's client ID does not match app's", 401)

    stored_access_token = login_session.get('access_token')
    stored_gplus_id = login_session.get('gplus_id')
    if stored_access_token is not None and gplus_id == stored_gplus_id:
        return make_json_response('Current user is already connected', 200)

    login_session['access_token'] = access_token
    login_session['gplus_id'] = gplus_id
    userinfo_url = 'https://www.googleapis.com/oauth2/v1/userinfo'
    params = {'access_token': access_token, 'alt': 'json'}
    answer = requests.get(userinfo_url, params=params)
    data = json.loads(answer.text)

    login_session['username'] = data['name']
    login_session['picture'] = data['picture']

    flash("You are now logged in as %s" % login_session['username'], 'success')

    return 'logged in'
Esempio n. 2
0
def gdisconnect():
    """Handles Google+ disconnect (logs people out of this app)."""

    access_token = login_session.get('access_token')
    if access_token is None:
        response = make_response(
            json.dumps('Current user is not connected'), 401)
        response.headers['Content-Type'] = 'application/json'
        return response
    url = 'https://accounts.google.com/o/oauth2/revoke?token=%s' % access_token
    h = httplib2.Http()
    result = h.request(url, 'GET')[0]

    del login_session['access_token']
    del login_session['gplus_id']
    del login_session['username']
    del login_session['picture']

    if result['status'] == '200':
        flash('You logged out.', 'success')
    else:
        flash("""You logged out, but something went wrong revoking
              your Google+ token. It shouldn't matter at all,
              but if you have any concern, you can visit the
              authorized apps page of you google account to make
              sure this app has been revoked.""", 'success')

    return redirect('/')