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 emai
l 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>',
'globals':globals()})
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>',
'globals':globals()})
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,
**{'globals':globals()})
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.
Comments (20)
- Login to post
order by: newest oldest upvoted downvoted
- sandeep-pandey-10076 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 comments0
sandeep-pandey-10076 9 years ago
hi i tried implement this code but i facebook login it is getting redirtected to auth_ext/denied
0
sandeep-pandey-10076 9 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 11 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)
0
cfhowes 12 years ago
1
select 11 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.