nginx - 由于 PWA Service Worker 缓存,Auth 基本 401 页面不提示输入凭据

标签 nginx basic-authentication progressive-web-apps http-status-code-401 offline-caching

我在我的开发站点(例如 dev.example.com)上使用基本身份验证,但我遇到了一个问题,即我的站点在我初次访问后没有提示我输入凭据。换句话说,如果我清除浏览器缓存,就会出现提示,我就可以正常登录了。 session 保持得很好,但是在 session 过期并且我自动注销后,我不会再次提示我输入凭据。

这也意味着如果我点击“取消”,我再也不会收到提示。

刷新并不能解决问题,我在初次访问后能够查看该站点的唯一方法是每次都使用隐身窗口,或者清除缓存并刷新页面。

该页面显示默认的 401 nginx 错误页面,响应是实际的 401 错误。

401 page headers

我试过移动 auth_basic行到我的配置的各个部分,但这似乎没有效果。我没有自定义 401 错误页面,所以我没有指定 error_page 401 ,会不会有问题?

我也发现了这个问题,IE, FireFox, Opera, and Safari don't display BASIC auth prompt on successive 401 responses from server

通过设置 www-authenticate 解决了该问题在标题上,但这是为我定义的。

这可能与配置有关吗?这是我当前的配置:

server {
    server_name dev.MYSITE.com;

    root /srv/dev/MYSITE/current;
    index index.php index.html index.htm;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_pass http://localhost:3010;
        proxy_redirect off;
        proxy_read_timeout 240s;

        # Basic HTTP Auth
        auth_basic "MYSITE Dev Site";
        auth_basic_user_file /etc/nginx/sites-password/MYSITE.htpasswd;
    }


    error_page 500 502 503 504 /50x.html;
    location = /50x.html {

    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/dev.MYSITE.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/dev.MYSITE.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = dev.MYSITE.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name dev.MYSITE.com;

    return 404; # managed by Certbot
}

注意:我使用 nginx 作为 Node.js 服务器的反向代理。

编辑:我不确定为什么这会相关,但这是一个支持离线模式的渐进式 Web 应用程序 (PWA)。我只是注意到,如果我绕过 Service Worker 的缓存,那么提示会正确显示(在开发工具 -> 应用程序 -> Service Worker -> 绕过网络中绕过)。

更新:看来我的服务 worker 正在缓存 401 响应并阻止提示。看来我之前可能需要找错地方了。

Response cached by service worker

更新 2:现在这看起来像是一个“功能”......
https://bugs.chromium.org/p/chromium/issues/detail?id=623464

最佳答案

我建议处理 response.status 值。如果它不是 200 (response.ok),那么您可能不想缓存它。

对于处理不同的响应状态代码、内容类型、路由等场景,我建议通过某种 if/else 或 switch/case 逻辑运行响应。

您的应用程序越复杂,Service Worker 缓存就越复杂:)

关于nginx - 由于 PWA Service Worker 缓存,Auth 基本 401 页面不提示输入凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52360253/

相关文章:

php - 处于休眠状态的高 Mysql 连接 + 大量运行的 PHP 实例/Magento

javascript - 将 RequireJS 主要优化文件作为 NGINX 的静态 Assets 提供

curl - 如何使用 Postman 使用 HTTP Basic 调用服务?

javascript - Chrome 无法安装 Progressive Web App

html - 视频元素未显示在页面上

php - Nginx + php-fpm 返回空白页面或 "no input file specified"

python - NGINX 在 Dockered Django 项目中找不到静态文件

c# - MVC 和 WebAPI 网站中的身份验证

Apache 2.2 重定向到 SSL *然后* 进行身份验证(使用解决方案 < 但这是废话吗?)

angular - 如何使用 service-worker + angular 修复 'Uncaught (in promise) bad-precaching-response' 错误