There is a major problem with the VPS that hosts the book. It is down and can no longer login into it. I am forced to restore it as May 29. This change will be lost. Sorry Anthony.
Massimo On Thursday, 31 May 2012 23:05:09 UTC-5, Anthony wrote: > > Just updated the book: > http://web2py.com/books/default/chapter/29/9#Access-Control-and-Basic-Authentication > > Anthony > > On Thursday, May 31, 2012 10:54:50 PM UTC-4, Anthony wrote: >> >> Sorry, forgot login_bare adds the user to auth, so it's simpler: >> >> auth.settings.allow_basic_login = True >> auth.basic() >> if auth.user: >> etc. >> >> Anthony >> >> On Thursday, May 31, 2012 10:49:04 PM UTC-4, Anthony wrote: >>> >>> If you can confirm that this works, I'll add it to the book. >>> >>> On Thursday, May 31, 2012 10:48:21 PM UTC-4, Anthony wrote: >>>> >>>> Looks like you can do: >>>> >>>> auth.settings.allow_basic_login = True >>>> auth.user = auth.basic()[2] >>>> if auth.user: >>>> etc. >>>> >>>> But this doesn't appear to be documented. Perhaps auth.basic() should >>>> automatically populate auth.user rather than simply returning it as part >>>> of >>>> a tuple. >>>> >>>> Anthony >>>> >>>> On Thursday, May 31, 2012 10:12:14 PM UTC-4, G. Clifford Williams wrote: >>>>> >>>>> Given the following code snippet in a controller (default or any >>>>> other): >>>>> >>>>> auth.settings.allow_basic_login = True >>>>> def howdy(): >>>>> auth.settings.allow_basic_login = True >>>>> response.view = 'generic.json' >>>>> if auth.user: >>>>> this_user = auth.user.id >>>>> else: >>>>> this_user = "unset" >>>>> return dict(user=this_user) >>>>> if the controller action is called as such: >>>>> % curl --user '[email protected]:supersecretpassword' >>>>> http://127.0.0.1:8000/myapp/controller/howdy >>>>> >>>>> this response you'll get it this: >>>>> {"user": "unset"} >>>>> >>>>> The same goes for using auth.is_logged_in(): >>>>> >>>>> The result is different, however, when you use one of the 'requires' >>>>> decorators: >>>>> >>>>> auth.settings.allow_basic_login = True >>>>> >>>>> def howdy(): >>>>> auth.settings.allow_basic_login = True >>>>> @auth.requires_login() >>>>> def proforma(): >>>>> pass #empty function just to invoke auth.requires >>>>> proforma() #call empty function >>>>> response.view = 'generic.json' >>>>> if auth.user: >>>>> this_user = auth.user.id >>>>> else: >>>>> this_user = "unset" >>>>> return dict(user=this_user) >>>>> this results in: >>>>> % curl --user '[email protected]:supersecretpassword' >>>>> http://127.0.0.1:8000/myapp/controller/howdy >>>>> {"user": 1} >>>>> >>>>> After some digging I discovered that in tools.py auth.requires_* ends >>>>> up calling login_bare which is why the second one works. I realize that >>>>> according to the book ( >>>>> http://web2py.com/books/default/chapter/29/9?search=login_bare) >>>>> login_bare() can be called to login the user "manually". Unfortunately >>>>> the >>>>> examples for auth.settings.allow_basic_login in the manual/book ( >>>>> http://web2py.com/books/default/chapter/29/9#Access-Control-and-Basic-Authentication, >>>>> >>>>> http://web2py.com/books/default/chapter/29/9#Settings-and-messages , >>>>> & http://web2py.com/books/default/chapter/29/10#Access-Control) don't >>>>> address the fact that no login is actually executed without the >>>>> decorators. >>>>> With the last example if someone wanted to use that as a guide they might >>>>> think that changing: >>>>> >>>>> @auth.requires_login() >>>>> @request.restful() >>>>> def api(): >>>>> def GET(s): >>>>> return 'access granted, you said %s' % s >>>>> return locals() >>>>> >>>>> to: >>>>> >>>>> >>>>> @request.restful() >>>>> def api(): >>>>> def GET(s): >>>>> >>>>> if auth.is_logged_in(): >>>>> return 'access granted, you said %s' % s >>>>> >>>>> else: >>>>> >>>>> return 'access denied' >>>>> return locals() >>>>> >>>>> >>>>> Should work, but they would be mistaken (and likely to spend much time >>>>> trying to figure out why one worked and the other did not). I don't know >>>>> whether it was the intention that using basic auth prevent a call to log >>>>> the user in by default. It seems that either the code should be fixed or >>>>> we >>>>> should update the documentation to clarify that login_bare() should be >>>>> called explicitly (directly or indirectly) to actually execute the login >>>>> process. >>>>> >>>>>

