If you benefit from web2py hope you feel encouraged to pay it forward by contributing back to society in whatever form you choose!

I have integrated the GAEMA code gaema with web2py to allow my sites to authenticate via Google, Twitter, and/or Facebook.

I modified the module very slightly and collapsed it into a single file - auth_base.py. From there I created the classes for Facebook, Twitter, and Google authentication. The auth_base.py file supports Friend Feed and perhaps other things that I was not interested in, so I did not implement them yet.

download the module files here authmodules.tgz

To use the modules, make sure that your auth_user table has both username and email in the fields. Twitter and Facebook don't provide email address in their callback, so they use username. Google uses the email field. (I suppose it would be easy to make Google use username as well). For Twitter and Facebook the username that I create is "Twitter_<uid>" or "Facebook_<uid>". I have considered creating a custom auth.get_or_create_user() method to allow the same user to associate multiple account types with a single auth_user record, but don't yet have use for that.

To use the auth modules, consider a controller something like:

def index():
    retval = dict()
    retval['twitter'] = A('Login Via Twitter', _href=URL(r=request, c='authtest', f='twitter'))
    retval['facebook'] = A('Login Via Facebook', _href=URL(r=request, c='authtest', f='facebook'))
    retval['google'] = A('Login Via Google', _href=URL(r=request, c='authtest', f='google'))
    return retval    

def twitter():
    if auth.is_logged_in():
        redirect(URL(r=request, c='default', f='index'))
    from applications.ec.modules.twitter_account import TwitterAuth
    auth.settings.login_form=TwitterAuth(request, response,
        'twitter_consumer_key':'<your key here>',
        'twitter_consumer_secret':'<your secret here>',

    return auth.login(next=URL(r=request, c='default', f='index'))

def facebook():
    if auth.is_logged_in():
        redirect(URL(r=request, c='default', f='index'))
    from applications.ec.modules.facebook_account import FacebookAuth
    auth.settings.login_form=FacebookAuth(request, response,
        'facebook_api_key':'<your key here>',
        'facebook_secret':'<your secret here>',

    return auth.login(next=URL(r=request, c='default', f='index'))

def google():
    if auth.is_logged_in():
        redirect(URL(r=request, c='default', f='index'))
    from applications.<appname>.modules.google_account import GoogleAuth
    auth.settings.login_form=GoogleAuth(request, response,

    return auth.login(next=URL(r=request, c='default', f='index'))

Update 2010-May-04

Facebook released the Graph API, and announced the end of FacebookConnect, so I did some rejiggering. the updated code is now an hg repository here: web2py_multiauth. The updated version also merges accounts if the user has the same email with a twitter login and facebook login for example. see the README file in the code for installation and configuration instructions.

Related slices

Comments (20)

  • Login to post

  • 0
    sandeep-pandey-10076 6 years ago

    hi i tried implement this code but i facebook login it is getting redirtected to  auth_ext/denied 

  • 0
    sandeep-pandey-10076 6 years ago

    Hi i tried to use this code to implement third party login and after i login thorugh facebook the page is getting redirected to auth_ext/denied and showing messages invalid view( auth_ext/denied.html).can some one tell me why this is not getting redirected to welcome page

  • 0
    cfhowes 8 years ago

    in theory most of the stuff should work.....there is an outstand patch submitted to the repo that i just noticed.  i wouldn't be suprised if it is broken though given that facebook and twitter have changed things over the years.

    the project i used this for is no longer supporting multiple authentication types, so i'm not actively user the code. :(

    replies (1)

  • 1
    select 8 years ago

    Can anybody tell me if this code still works or if I should try something else. My only restriction is that I do not want do use janrian or other external services.

  • 0
    cfhowes 9 years ago
    sorry for the slow response..... yes facebook has been changing things around - i might have some broken apps out there in the wild! i tend to use logging statement copiously to trace through and see where it is having problems. do you get an error message?
show more comments

Hosting graciously provided by:
Python Anywhere