O Chrome ignora a diretiva Set-Cookie do proxy reverso nginx

2

Desejo expor a v1.2 da minha API (e sua documentação) a usuários na China. O site pai mysite.mycompany.com está bloqueado para eles, mas 1.2.3.4 não é, por isso estou criando um proxy reverso nesse endereço que eles podem usar para acessar meu serviço.

Configurei um Nginx para inverter o proxy http://mysite.mycompany.com para http://1.2.3.4

O proxy funciona muito bem no Firefox e no IE, mas não no Chrome. O login é gerenciado usando cookies, mas o Chrome ignora o cabeçalho Set-Cookie enviado pelo proxy durante o login, e não entendo o motivo. Isso impede que os usuários do Chrome façam login.

Os cabeçalhos de resposta do site pai para a solicitação de login (onde o Set-Cookie é bem-sucedido e o login é bem-sucedido) são

HTTP/1.1 302 Found
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html; charset=UTF-8
Date: Tue, 12 Aug 2014 18:16:57 GMT
ETag: "1407867417"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 12 Aug 2014 18:16:57 +0000
Location: http://mysite.mycompany.com/user/me/apps
Server: Apache
X-Powered-By: PHP/5.3.15
Content-Length: 0
Connection: Keep-Alive
Set-Cookie: SESS25fe1d0b3b7239f403e22223da0614cf=Oo-PXr4XYQCFUKYUyZgX3UJpWADAhF_q7Xf-8gko3BU; expires=Thu, 04-Sep-2014 21:50:17 GMT; path=/; domain=.mysite.mycompany.com; HttpOnly

enquanto o site proxy (em que Set-Cookie falha e o login não é bem-sucedido) tem os seguintes cabeçalhos de resposta:

HTTP/1.1 302 Found
Server: nginx/1.4.7
Date: Tue, 12 Aug 2014 18:57:42 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Location: http://1.2.3.4/user/me/apps
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1407869862"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 12 Aug 2014 18:57:42 +0000
X-Powered-By: PHP/5.3.15
Connection: Keep-Alive
Set-Cookie: SESS25fe1d0b3b7239f403e22223da0614cf=DrY_4Y1NUPdIv9MsXPMjCr7Bzkq7DjyOmQPcNhetKXU; expires=Thu, 04-Sep-2014 22:31:02 GMT; path=/; domain=.1.2.3.4; HttpOnly

A parte interessante da minha configuração do nginx é

http {
    # Ngnix defaults up to here then

    proxy_cache_path /var/spool/nginx keys_zone=CACHE:20m levels=1:2 inactive=6h max_size=1g;

    server {
        listen  80;


        location /v1.2/ {
                proxy_pass  http://api.mysite.mycompany.com/v1.2/;
                proxy_set_header  X-Real-IP    $remote_addr;
                proxy_set_header  X-Real-HOST  $host;
        }


        location / {
                proxy_pass      http://mysite.mycompany.com;
                # Required to prevent the host serving gzipped pages that can't be modified with sub_filter
                proxy_set_header        Accept-Encoding ''; 
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Real-HOST  $host;
                proxy_cookie_domain     mysite.mycompany.com     1.2.3.4;
                sub_filter      "mysite.mycompany.com"   "1.2.3.4";
                sub_filter_once off;
                proxy_cache     CACHE;
        }

    }

}

Eu tentei com os elementos de cache desativados, mas não parece mudar nada.

Você tem alguma ideia do motivo pelo qual o Chrome pode estar se recusando a definir o cookie do proxy?

    
por Tadhg 12.08.2014 / 21:22

1 resposta

4

Acabou por não ser um problema com o conf nginx - isso foi bom.

O problema deve-se ao facto de o Chrome permitir apenas a definição de cookies a partir de nomes de domínio totalmente qualificados, não para endereços IP

link

Comprei um nome de domínio, apliquei-o no meu servidor e funcionou. Foi necessária uma alteração na configuração do nginx, que eu deveria ter feito originalmente, que é substituir essas duas linhas

            proxy_cookie_domain     mysite.mycompany.com     $host;
            sub_filter      "mysite.mycompany.com"   $host;
    
por 12.08.2014 / 23:23