Hi there! I'm having this issue I would like to share with you, I hope to 
find a solution.

*This is the scenario*:

 - Two different apps, let's call them *development* and *development_panel*
* - *Both apps uses the *same model* (shared through symlinks)
 - *development* app is served at *development.com*
* - **development**_panel* app is served at *panel.**development**.com*
 - Login is done in *development**_panel* app and cookie is shared for 
*development* app (so, the visitor logs in at *panel.**development**.com* and 
that cookie is shared also with *development**.com*)


*How does it work?*

First, I have the domains mapped to apps within my routes.py

routers = dict(
  BASE=dict(
    default_controller='default',
    default_function='index',
    domains={
        'development.com': 'development',
        'panel.development.com': development_panel,
    },
    map_static=True,
    exclusive_domain=True,
  )
)

Notice exclusive_domain=True, meaning that each app can be accessed only 
through the specificed domain, and not from another one. This works like a 
charm.


Second, the db.py file is defined in one app, and symlinked from the other 
one. The "databases" folder was moved out from inside the app folder, so it 
is specified when instantiating DAL:

db = DAL(
    'postgres://%s:%s@%s/%s' % (CONFIG.db_user, CONFIG.db_user_password,
 CONFIG.db_host, CONFIG.db_name),
    migrate=False,
    lazy_tables=True,
    folder=CONFIG.databases_folder)


Third, both apps connect to the session specifying *development* as the 
*masterapp*:

session.connect(request, response, db=db, masterapp='development')


Fourth and last, this code is right after session.connect, and it's the one 
that makes the magic. 
This two lines of code are the ones needed in order to share the login 
session between the two apps:

if response.session_id_name in response.cookies:
    response.cookies[response.session_id_name]['domain'] = 'development.com'


Now, remember the login is done in *development_panel* and *development* is 
defined as the masterapp. Well, all this is working ok, I have several 
websites running this way (every website has its own domain and its couple 
of apps installed, served the same way as the example I exposed). However, 
*very 
few customers are reporting they can't login*. Actually, they login 
successfully to the panel, but then they go to the main domain and they 
aren't logged in anymore. That is, the cookie is being written but not read 
(not shared across domains). This happens only on a specific subset of 
devices and browsers (so far, it's been reported to happen a lot in Safari 
for iPhone).

As I said, the current approach is working for the vast majority of 
customers. However, as some of them reported the problem, I wanted to check 
the cookies. And that's when I saw all this mess, or at least I think it's 
a mess.
Having erased all cookies from the browser, without being logged in, I go 
to the login page at *panel.development.com* and this is what I see in the 
cookies:

<https://lh3.googleusercontent.com/-K5eNM35F4yQ/Wnt84F-_qqI/AAAAAAAAHww/kgSCxcVXVGsjsnORuE0iMBs6GmZOsbGUACLcBGAs/s1600/capture1.png>



I can already see a strange cookie "*session_id_development_panel*" that I 
don't know where it comes from.

I checked the gluon/globals.py code to see where is that name generated:

https://github.com/web2py/web2py/blob/master/gluon/globals.py#L846


Notice it uses the *masterapp* to generate that name, and if you check my 
previous code, you will see that I connect to the session using 
masterapp='development'.

So where does *session_id_development_panel* comes from?


What is more weird is this: after a successfull login, the app takes me to 
the main domain, and there I see these cookies:


<https://lh3.googleusercontent.com/-hsduZYg_Q0E/Wnt9-L0R5FI/AAAAAAAAHw4/JM1ctM_cpkM8ZPScC-ej-4gdL_KisBaRgCLcBGAs/s1600/capture2.png>



*Notice the duplicated cookie name with different values*. Where does it 
come from?


Now that I see all this, I'm starting to think that the problem reported by 
some customers is produced by this cookie mess. 

Somehow Chrome, Firefox and Edge don't complain about this and it works ok. 
However some browsers don't like this, and refuse to share the cookie.


Any thoughts? Anything I should check or modify?


I've read documentation about cookies:

http://web2py.com/books/default/chapter/29/4#Cookies


There, you can see what is needed in order to share the cookie across 
multiple domains, but the documentation mentions a single app. 

What about my case? I know there is something that I have to change, but I 
can't figure out what.


Any help will be appreciated.

Thanks in advance!


Regards,

Lisandro.

-- 
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/d/optout.

Reply via email to