Hi Luciano, Did you find a way to use auth.settings.login_form in the controllers? I am facing the same issue.
Regards, Tito On Mon, Dec 23, 2013 at 2:06 PM, Luciano Laporta Podazza < [email protected]> wrote: > Thanks for the advice Leonel!, > > You're totally right, I should change the workflow, for instance, register > the user using web2py auth and then asking for Facebook/Twitter permissions > to access their API. > > On the other hand, I'm still having some issues if I change the workflow: > Web2py stores Facebook user's data only if I set *auth.settings.login_form > *in *db.py *and I trigger /user/login. Otherwise it does not work as > expected. > > This is the code I'm currently using: > *db.py:* > > > auth_table = db.define_table( > auth.settings.table_user_name, > Field('name', length=128, default=""), > Field('first_name', length=128, default=""), > Field('last_name', length=128, default=""), > Field('username', length=128, default="", unique=True), > Field('password', 'password', length=256, readable=False, label='Password' > ), > Field('registration_id', length=128, default= "", writable=False, readable > =False), > Field('registration_key', length=128, default= "", writable=False,readable > =False)) > > > auth_table.username.requires = IS_NOT_IN_DB(db, auth_table.username) > auth.define_tables(username=False, signature=False) > > > ## configure email > mail = auth.settings.mailer > mail.settings.server = 'logging' or 'smtp.gmail.com:587' > mail.settings.sender = '[email protected]' > mail.settings.login = 'username:password' > > > ## configure auth policy > auth.settings.registration_requires_verification = False > auth.settings.registration_requires_approval = False > auth.settings.reset_password_requires_verification = True > > > ## Define oauth application id and secret. > FB_CLIENT_ID='my_id' > FB_CLIENT_SECRET="my_secret" > > > # import required modules > try: > import json > except ImportError: > from gluon.contrib import simplejson as json > from facebook import GraphAPI, GraphAPIError > from gluon.contrib.login_methods.oauth20_account import OAuthAccount > > > > > ## extend the OAUthAccount class > class FaceBookAccount(OAuthAccount): > """OAuth impl for FaceBook""" > AUTH_URL="https://graph.facebook.com/oauth/authorize" > TOKEN_URL="https://graph.facebook.com/oauth/access_token" > > > def __init__(self): > OAuthAccount.__init__(self, None, FB_CLIENT_ID, FB_CLIENT_SECRET, > self.AUTH_URL, self.TOKEN_URL, > scope='email,user_about_me,user_activities, > user_birthday, user_education_history, user_groups, user_hometown, > user_interests, user_likes, user_location, user_relationships, > user_relationship_details, user_religion_politics, user_subscriptions, > user_work_history, user_photos, user_status, user_videos, publish_actions, > friends_hometown, friends_location,friends_photos', > state="auth_provider=facebook", > display='popup') > self.graph = None > > > def get_user(self): > '''Returns the user using the Graph API. > ''' > if not self.accessToken(): > return None > > > if not self.graph: > self.graph = GraphAPI((self.accessToken())) > > > user = None > try: > user = self.graph.get_object("me") > except GraphAPIError, e: > session.token = None > self.graph = None > > > if user: > if not user.has_key('username'): > username = user['id'] > else: > username = user['username'] > > if not user.has_key('email'): > email = '%s.fakemail' %(user['id']) > else: > email = user['email'] > > > return dict(first_name = user['first_name'], > last_name = user['last_name'], > username = username, > email = '%s' %(email) ) > > > # auth.settings.login_form=FaceBookAccount() > crud.settings.auth = None > > > import oauth2 as oauth > from gluon.contrib.login_methods.oauth10a_account import OAuthAccount as > OAuthAccount10a > > > consumer_key = "my_key" > consumer_secret = "my_secret" > > > class TwitterAccount(OAuthAccount10a): > AUTH_URL = "http://twitter.com/oauth/authorize" > TOKEN_URL = "https://twitter.com/oauth/request_token" > ACCESS_TOKEN_URL = "http://twitter.com/oauth/access_token" > def __init__(self, g=globals()): > OAuthAccount10a.__init__(self, g, > consumer_key, > consumer_secret, > self.AUTH_URL, > self.TOKEN_URL, > self.ACCESS_TOKEN_URL) > > def get_user(self): > if self.accessToken() is not None: > client = oauth.Client(self.consumer, self.accessToken()) > resp, content = client.request(' > http://api.twitter.com/1.1/account/verify_credentials.json') > if resp['status'] != '200': > # cannot get user info. should check status > return None > u = json.loads(content) > return dict(username=u['screen_name'], > name=u['name'],registration_id > =str(u['id'])) > > > *controller.py:* > def twitter(): > auth.settings.login_form=TwitterAccount() > return dict(form=auth()) > > > def facebook(): > auth.settings.login_form=FaceBookAccount() > return dict(form=auth()) > > > So the idea is to call *myapp/default/twitter* or *myapp/default/facebook*to > get some user data and store it in DB but when it gets facebook/twitter > authorization then I get redirected to */user/login *and nothing happens. > > I've been reading the manuals, outdated examples, etc; and can't find a > good hint about what to do. > > Any help will be appreciated. > > Thanks. > > On Monday, December 23, 2013 8:02:16 AM UTC-3, Leonel Câmara wrote: >> >> I wouldn't bother, you shouldn't be using twitter login if you want to >> merge on email accounts as twitter does not provide you with the user's >> email. >> >> So, you have conflicting requisites, you want to merge social logins >> based on email and you want to have twitter login. >> >> It's possible, you can always ask the user for his email, but if you're >> going to all that trouble just make him register. >> >> Clients need to be made aware that using twitter to login for websites is >> mostly stupid unless your website is actually based around interacting with >> twitter as most websites end up needing the user's email address anyway. >> > -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. > -- Linux User #387870 .........____ .... _/_õ|__| ..º[ .-.___.-._| . . . . .__( o)__( o).:_______ -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.

