2014-09-12 2 views
0

J'ai l'application Tornado, fonctionnant comme un serveur API, qui traite les demandes provenant de plusieurs autres sites. Je prévois également d'utiliser nginx comme équilibreur de charge.Tornade + cookies nginx CORS

Le problème provient des cookies CORS. Lorsque quelqu'un visite le site du partenaire, partner.com, par exemple, le script JS envoie plusieurs requêtes à mon serveur. La première demande vise à définir plusieurs cookies. Mais ça ne marche pas.

Ce que je:

  1. Aucun paramètre d'en-tête sur tornade
  2. La configuration suivante sur nginx

    access_log /var/log/nginx/api_access.log; 
    error_log /var/log/nginx/api_error.log; 
    
    add_header Access-Control-Allow-Origin http://salesmarine.ru; 
    add_header Access-Control-Allow-Credentials 'true'; 
    add_header Set-Cookie test=111; 
    
    location/{ 
        proxy_pass_header Server; 
        proxy_set_header Host $http_host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Scheme $scheme; 
        proxy_pass http://api; 
        proxy_next_upstream error; 
    } 
    
  3. Toutes les demandes de JS sont envoyés avec .withCredentials=true; l'option Voici la demande données:

    Accept:*/* 
    Accept-Encoding:gzip,deflate,sdch 
    Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 
    Cache-Control:max-age=0 
    Connection:keep-alive 
    Content-Type:application/x-www-form-urlencoded 
    Cookie:t_id=d9ed7601a2074e78b5ba38ab58ad7043; t_id_session=0c7910f9b3194e899d233e68380df59f;     test=111 
    Host:server.com 
    If-None-Match:"bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" 
    Origin:http://example.com 
    Referer:http://example.com/test 
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/37.0.2062.120 Safari/537.36 
    Query String Parametersview sourceview URL encoded 
    id:54129700102392342dff6dbe 
    apiKey:2a8bb0a06bca4ad59c4d4079dce30a30 
    client_id:54129700102392342dff6dbe 
    apikey:2a8bb0a06bca4ad59c4d4079dce30a30 
    user_id:null 
    Response Headersview source 
    Access-Control-Allow-Credentials:true 
    Access-Control-Allow-Origin:http://example.com 
    Connection:keep-alive 
    Date:Fri, 12 Sep 2014 19:40:17 GMT 
    Etag:"bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" 
    Mime-Type:text/javascript 
    Server:TornadoServer/4.0.2 
    Set-Cookie:test=111 
    

Et aucun cookie n'est envoyé. Quel pourrait être le problème?

Et aussi ce qui est mieux - les en-têtes de contrôle de tornade, ou nginx?

Répondre

0

Eh bien, je l'ai compris. Le problème était CORS lui-même - je suis incapable de placer des cookies pour un autre domaine. Access-Control-Allow-Credentials permettre de faire cela, mais que les cookies seraient indisponibles pour JS sur ce domaine.

Il y a beaucoup de liens vers this resourse, mais c'est vraiment utile pour comprendre CORS.

La deuxième partie de ma question initiale est de rester ambigu pour moi. Une conjecture sauvage - si vous utilisez nginx + tornado, nginx reçoit les requêtes entrantes en premier. Donc, il devrait retourner les en-têtes appropriés.