NGINX 反向代理 WebSockets,并进行 JWT 认证,但没有 Access-Control-Allow-Origin 头部

我的目标是使用 NGINX 反向代理服务器来终止前端的 wss 连接并建立与后端的 ws 连接。我还需要使用 JWT 令牌对客户端进行身份验证,我成功地发出令牌并通过 Cookie 传递给了 NGINX 代理。

我使用 nginx-jwt 包 (https://github.com/auth0/nginx-jwt) 与 NGINXOpenResty 分发。我的 nginx.conf 文件如下:

env JWT_SECRET; env JWT_SECRET_IS_BASE64_ENCODED; http { ... lua_package_path "usr/local/openresty/nginx-jwt;;"; map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream appserver { server [server ip]:[port]; } server { server_name api.[domain].org; listen 443 ssl; listen 80; ssl on; ssl_certificate /etc/letsencrypt/live/api.[domain].org/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dev.[domain].org/privkey.pem; locaiton /connect { access_by_lua_block { local jwt = require("nginx-jwt") jwt.auth() } proxy_pass http://appserver$uri; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; add_header Access-Control-Allow-Origin https://[domain].org; } } }

当我尝试从浏览器访问 [domain].org/connect/[sockjs stuff] 时,我会得到以下错误:

Failed to load https://api.[domain].org/connect/info?t=1531334401388: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://[domain].org' is therefore not allowed access. The response had HTTP status code 500.

奇怪的是,当我注释掉 access_by_lua_block{} 时,我得到一个 200 的响应,但是有以下错误:

Failed to load https://api.[domain].org/connect/info?t=1531336691243: The 'Access-Control-Allow-Origin' header contains multiple values 'https://[domain].org, https://[same domain].org', but only one is allowed. Origin 'https://[domain].org' is therefore not allowed access.

并且没有建立任何 WebSocket 连接。

但是,如果我同时注释掉 access_by_lua_block{}add_header Access-Control-Allow-Origin https://[domain].org; ,我就能成功地与后端建立 WebSocket 连接。

我已经连续几天一直在解决这个问题。请帮帮我。

点赞
用户10066637
用户10066637

问题已解决:我的 lua_package_path 上的相对路径指向的是一个目录而不是实际的 *.lua 文件。我将路径更改为 /usr/local/openresty/nginx-jwt/?.lua;/usr/local/openresty/nginx-jwt/lib/?.lua;;

我还从 nginx.conf 中删除了 add_header Access-Control-Allow-Origin,因为我也在后端处理它,所以会因为 Access-Control-Allow-Origin 标头的多个条目而出现错误。

显然,浏览器抛出的 CORS 错误只是由于浏览器由于代码中的错误而无法访问有效的端点所导致的结果。

2018-07-12 14:51:21