web 部署专题(八):Nginx 反向代理中cookie相关问题

OwenJi 2020-04-18

问题3:认证问题

Domino服务器中,通过写了一些接口代码,提供RESTful的服务,来对手机端进行提供服务。但是由于原来的环境,没有SSO,而且不通过认证,没法访问到Domino里面的接口代码。
解决方案:
手机端通过HTTP,模拟登录过程

问题4:“问题3”的解决方案,由于经过了反向代理,导致Domino的Response中Cookie的Domain属性,与反向代理的域名不一致,Cookie的Domain属性,仍然是Domino服务器的域名。手机端拿到Cookie之后,再次进行请求的话,请求是发往反向代理的,浏览器认为之前拿到的Cookie不属于反向代理,所以Request的时候,不会把Cookie带上,导致认证不能通过。

解决方案:

location / {
    proxy_cookie_domain domino_server nginx_server;
}

在Nginx上这样设置后,可以让反向代理修改Cookie的Domain属性。

问题5:“问题4”的解决方案,适合反向代理服务器有域名的情况,对于没有域名的情况,虽然浏览器收到的Response中有正确的Cookie信息(从Chrom开发工具的Network页签查看,包括域名也已经经过转换成反向代理的域名),但是浏览器却没能正常保存这个Cookie(从Chrom开发工具的Application页签查看Cookie)。这一点比较奇怪,Java写的程序,通过反向代理后,不论反向代理是IP还是域名,浏览器端都可以正常拿到Cookie并保存,具体原因还没搞清。不知是否Domino服务器是否有什么特别的安全设置。

解决方案:
在Domino服务器所在的内网,增加另一台Java服务器,经过反向代理的请求,先发给这台Java服务器,由这台Java服务器将Request转发至Domino,收到Domino的Response之后,抽取Cookie,并进行设置,以保证返回给浏览器的Cookie能被保存。
至此,服务器部分问题解决。


补充说明:

“问题5”中,开始的解决方案,是Java服务器将拿到的Cookie通过Response的Body返回,由页面JS将Cookie写入。但是这种方案,当页面位于服务端时有效(跨域一样有效),但是对于通过Electron打包的本地页面,JS无法将Cookie正常写入,这一点也暂时原因不明,不知道是否是由于浏览器认为本地页面写的Cookie与服务端跨域?对于本地页面,还是需要服务端在Response中正常返回Cookie。

问题6:iOS版集成Cordova后,通过本地页面访问服务器,收到的Cookie不能正常保存,但是直接使用Cordova打包是可以的。

解决方案:
发现Cordova直接打包的应用,AppDelegate继承自原来的CDVAppDelegate,这个类初始化时执行了:

NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

    int cacheSizeMemory = 8 * 1024 * 1024; // 8MB
    int cacheSizeDisk = 32 * 1024 * 1024; // 32MB
    NSURLCache* sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
    [NSURLCache setSharedURLCache:sharedCache];

将这部分代码加入自己应用的初始化部分即可。

nginx.conf 完整配置
location /myapp {
     add_header ‘Access-Control-Allow-Origin‘ ‘*‘;
     add_header ‘Access-Control-Allow-Credentials‘ ‘true‘;
     add_header ‘Access-Control-Allow-Methods‘ ‘GET, POST, OPTIONS‘;
     add_header ‘Access-Control-Allow-Headers‘ ‘DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type‘;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Cookie $http_cookie;
     proxy_pass http://domino.server/;
     proxy_cookie_domain domino.server nginx.server;
     proxy_redirect off;
}
作者:舌尖上的大胖
链接:https://www.jianshu.com/p/aeed2a56a3eb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐