I see, your theory is pretty much accurate (sorry for my english, I hope 
that phrase is correct). What I mean is that your theory is the most 
addecuate for this case, thought it can't be proved. Actually, there is 
another error that says something about access token been already used, but 
happens very little.

My question now is: ¿can I avoid this situation and do something? 

I have this in one of my models:

if session.login_facebook:
    from globales import FaceBookAccount
    auth.settings.login_form = FaceBookAccount(globals())

And this is te dfinition of FaceBookAccount class:

class FaceBookAccount(OAuthAccount):
    AUTH_URL="https://graph.facebook.com/oauth/authorize";
    TOKEN_URL="https://graph.facebook.com/oauth/access_token";

    def __init__(self, g):
        OAuthAccount.__init__(self, g, current.FACEBOOK_APP_ID, 
current.FACEBOOK_APP_SECRET_KEY, \
          self.AUTH_URL, self.TOKEN_URL, scope='email')
        self.graph = None

    def get_user(self):
        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:
            self.session.token = None
            self.graph = None
        if user:
            return dict(first_name='%s %s' %(user['first_name'], 
user['last_name']), \
              username=user['id'], registration_id=user['id'], 
email=user['email'])

I would like to, at least, show an error message to the user saying that 
something went wrong trying to get his/her email from Facebook, and that 
he/she should try again. Can't figure it out how to do it :/


El martes, 29 de octubre de 2013 03:48:36 UTC-3, Christian Foster Howes 
escribió:
>
> the problem is that facebook is not returning an email.
>
> i know, i know, you told facebook that email is required and you can't 
> reproduce such a state.  i'm 100% with you, but i see the exact same 
> behavior with my users!  i suspect that these are actually returning users 
> who granted email access when they first created an account, but then they 
> changed their facebook permissions to remove email access and when they 
> return to your site and login, facebook lets them (because they have 
> before), but does not give you the email address.   i have not confirmed 
> this theory, but it's my running theory.
>
> other potential issue is the expiration of the facebook access token.  
> those rules changed this spring and i'm not 100% up to date on the rules 
> right now.
>
> cfh
>
> On Monday, October 28, 2013 10:57:06 AM UTC-7, Lisandro wrote:
>>
>> I'm having a similar problem with KeyError: 'email'.
>>
>> I have a site in production that uses oauth2 and offers the possibility 
>> of register/login using personal facebook account. 
>> I created a Facebook app and set permissions to get user's email (so I 
>> can create the account on my site). Everything works perfect, lots of users 
>> have registered in my site using their Facebook accounts. Even myself.
>>
>> However, there are some error tickets created with this error of 
>> "KeyError:email". First I thought that some users didn't let the 
>> application get their emails, but that's not possible. When you try to log 
>> in my site using Facebook, facebook tells you that te application will get 
>> your email, and you only can accept or decline. If you decline, you're not 
>> registered. And if you accept, my site gets your email and creates the 
>> account.
>>
>> So, I don't know which could be the problem. This is the traceback of the 
>> error:
>>
>> Traceback (most recent call last):
>>   File "/var/www/vendosimple/gluon/restricted.py", line 212, in restricted
>>     exec ccode in environment
>>   File "/var/www/vendosimple/applications/init/controllers/default.py", line 
>> 645, in <module>
>>   File "/var/www/vendosimple/gluon/globals.py", line 194, in <lambda>
>>     self._caller = lambda f: f()
>>   File "/var/www/vendosimple/applications/init/controllers/default.py", line 
>> 380, in user
>>     form = auth()
>>   File "/var/www/vendosimple/gluon/tools.py", line 1250, in __call__
>>     return getattr(self, args[0])()
>>   File "/var/www/vendosimple/gluon/tools.py", line 2128, in login
>>     cas_user = cas.get_user()
>>   File "applications/init/modules/globales.py", line 41, in get_user
>>     username=user['id'], registration_id=user['id'], email=user['email'])
>> KeyError: 'email'
>>
>>
>> Any ideas? 
>>
>>
>> El martes, 7 de junio de 2011 01:00:33 UTC-3, Massimo Di Pierro escribió:
>>>
>>> I am not familiar with facebook email. 
>>>
>>> If this (username + @facebook) is avlid email, perhaps web should set 
>>> that even if username=True 
>>>
>>> On Jun 6, 7:15 pm, "Sebastian E. Ovide" <sebastian.ov...@gmail.com> 
>>> wrote: 
>>> > I do not see major pros and cons... it is a matter of precerences... 
>>> > 
>>> > 1) setting username=True in auth.define_tables(), define_tables will 
>>> add a 
>>> > field on the table (username) and if that field is present, 
>>> authentication 
>>> > will be done using username. Personally I prefer to use emails rather 
>>> than 
>>> > usernames, and as I am using BOTH web2py auth and facebook at the same 
>>>  time 
>>> > for authentication (two different links for different logins), I 
>>> didn't want 
>>> > to force my application to use usernames.... so I've used the second 
>>> option 
>>> > 
>>> > 2) in this case I'm adding an email created by the facebook username + 
>>> > @facebook and therefore auth will keep using email for 
>>> authentication... 
>>> > 
>>> > no web2py code has been touched, although I'm extending Auth and 
>>> > overriding navbar to display a second login link (facebook) and hide 
>>> > change_password when it is logged in via facebook. 
>>> > 
>>> >             if session.login_method_used is None: 
>>> >                 if not 'change_password' in 
>>> self.settings.actions_disabled: 
>>> >                     bar.insert(-1, ' | ') 
>>> >                     bar.insert(-1, password) 
>>> > 
>>> > and in my controller: 
>>> > 
>>> > def user(): 
>>> >     if auth.user_id: 
>>> >         if request.args[0] == 'logout': 
>>> >             session.login_method_used=None 
>>> >     else: 
>>> >         if request.args[0] == 'login': 
>>> >             session.login_method_used=None 
>>> >         elif request.args[0] == 'login_fb': 
>>> >             session.login_method_used="facebook" 
>>> >             request.args[0]='login' 
>>> > 
>>> >     if session.login_method_used=="facebook": 
>>> >         auth.settings.login_form=FaceBookAccount(globals()) 
>>> > 
>>> >     return dict(form=auth()) 
>>> > 
>>> > On Mon, Jun 6, 2011 at 11:16 PM, Massimo Di Pierro < 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > massimo.dipie...@gmail.com> wrote: 
>>> > > if there is agreement on one, please send me a patch. 
>>> > 
>>> > > On Jun 6, 4:31 pm, "Sebastian E. Ovide" <sebastian.ov...@gmail.com> 
>>> > > wrote: 
>>> > > > Hi Mic, 
>>> > 
>>> > > > thanks for that. 
>>> > 
>>> > > > actually I've debugged web2py and figure it out for myself. There 
>>> are two 
>>> > > > easy ways to fix it (I've tried to add them to the book, but my 
>>> account 
>>> > > > doesn't allow me to edit it) 
>>> > 
>>> > > > 1) set username=False in auth.define_tables() 
>>> > > > 2) add  email = user['username']+"@facebook.com" in the return of 
>>> def 
>>> > > > get_user 
>>> > 
>>> > > > On Mon, Jun 6, 2011 at 10:02 PM, Michele Comitini < 
>>> > 
>>> > > > michele.comit...@gmail.com> wrote: 
>>> > > > > Hi Sebastian, 
>>> > 
>>> > > > > copy from this example: 
>>> > 
>>> > > > >
>>> http://code.google.com/r/michelecomitini-facebookaccess/source/browse. 
>>> > > .. 
>>> > 
>>> > > > > < 
>>> > >http://code.google.com/r/michelecomitini-facebookaccess/source/browse.. 
>>>
>>> > > .>and 
>>> > > > > let me know 
>>> > 
>>> > > > > mic 
>>> > 
>>> > > > > 2011/6/6 Sebastian E. Ovide <sebastian.ov...@gmail.com> 
>>> > 
>>> > > > > Hi All, 
>>> > 
>>> > > > >> just wondering if the section "OAuth2.0 and Facebook" of the 
>>> book is 
>>> > > up to 
>>> > > > >> date? 
>>> > 
>>> > > > >> I following it's instructions but I'm getting an "Internal 
>>> error" 
>>> > 
>>> > > > >> to reproduce 
>>> > 
>>> > > > >> 1) get last web2py 1.196.3 
>>> > > > >> 2) follow the instructions from the book 
>>> > > > >> 2.a) get facebook and place it in modules 
>>> > > > >> 2.b) copy the code from the book 
>>> > > > >> 2.c) replace "from facebook import GraphAPI" with "facebook = 
>>> > > > >> local_import('facebook')" 
>>> > > > >> 2.d) replace facebook. to GraphAPIError and GraphAPI 
>>> > > > >> 2.e) replace YOUR_CLIENT_ID and YOUR_CLIENT_SECRET with real 
>>> data 
>>> > > > >> 3) set your app URL tohttp://localhost:8000/welcome/ 
>>> > 
>>> > > > >> Is something missing ? 
>>> > 
>>> > > > >> When I click login, it redirect me to facebook, where I can 
>>> login, and 
>>> > > > >> then it redirects me tohttp://localhost:8000/welcome/ 
>>> > 
>>> > > > >> At that point I get an error: 
>>> > 
>>> > > > >>  TRACEBACK 
>>> > 
>>> > > > >> 1. 
>>> > > > >> 2. 
>>> > > > >> 3. 
>>> > > > >> 4. 
>>> > > > >> 5. 
>>> > > > >> 6. 
>>> > > > >> 7. 
>>> > > > >> 8. 
>>> > > > >> 9. 
>>> > > > >> 10. 
>>> > > > >> 11. 
>>> > > > >> 12. 
>>> > > > >> 13. 
>>> > > > >> 14. 
>>> > > > >> 15. 
>>> > > > >> 16. 
>>> > 
>>> > > > >> Traceback (most recent call last): 
>>> > 
>>> > > > >>   File "/home/sebas/Downloads/web2py/gluon/restricted.py", line 
>>> 184, 
>>> > > in restricted 
>>> > 
>>> > > > >>     exec ccode in environment 
>>> > 
>>> > > > >>   File 
>>> > > 
>>> "/home/sebas/Downloads/web2py/applications/welcome/controllers/default.py" 
>>> < 
>>> > >
>>> http://localhost:8000/admin/default/edit/welcome/controllers/default.py>, 
>>>
>>> > > line 71, in <module> 
>>> > 
>>> > > > >>   File "/home/sebas/Downloads/web2py/gluon/globals.py", line 
>>> 137, in 
>>> > > <lambda> 
>>> > 
>>> > > > >>   /  self._caller = lambda f: f() 
>>> > 
>>> > > > >>   File 
>>> > > 
>>> "/home/sebas/Downloads/web2py/applications/welcome/controllers/default.py" 
>>> < 
>>> > >
>>> http://localhost:8000/admin/default/edit/welcome/controllers/default.py>, 
>>>
>>> > > line 33, in user 
>>> > 
>>> > > > >>     return dict(form=auth()) 
>>> > 
>>> > > > >>   File "/home/sebas/Downloads/web2py/gluon/tools.py", line 
>>> 1070, in 
>>> > > __call__ 
>>> > 
>>> > > > >>     return getattr(self,args[0])() 
>>> > 
>>> > > > >>   File "/home/sebas/Downloads/web2py/gluon/tools.py", line 
>>> 1626, in 
>>> > > login 
>>> > 
>>> > > > >>     user = 
>>> > > self.get_or_create_user(table_user._filter_fields(cas_user)) 
>>> > 
>>> > > > >>   File "/home/sebas/Downloads/web2py/gluon/tools.py", line 
>>> 1360, in 
>>> > > get_or_create_user 
>>> > 
>>> > > > >>     user = self.db(table_user[username] == 
>>> > > keys[username]).select().first() 
>>> > 
>>> > > > >> KeyError: 'email' 
>>> > 
>>> > > > >> any ideas , thanks 
>>> > 
>>> > > > >> -- 
>>> > > > >> Sebastian E. Ovide 
>>> > 
>>> > > > -- 
>>> > > > Sebastian E. Ovide 
>>> > 
>>> > -- 
>>> > Sebastian E. Ovide
>>
>>

-- 
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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to