0

我一直在使用 Google Cloud IAP 来保护我在https://some-domain下的网络应用。但是,我在使用 nginx + 静态 SPA 访问 Cloud IAP 特殊 url 时发现了一个问题。我发现如果我没有登录,我可以访问以下指定的特殊 url:https ://cloud.google.com/iap/docs/special-urls-howto 。https://some-domain/_gcp_iap/identity因此,如果我没有登录,我可以轻松访问诸如此类的端点。

但是,在我登录后,我无法再访问特殊的 url ( /_gcp_iap/*) 并被重定向到 SPA 错误页面。我注意到我的 nginx 配置中有这个:

location / {
    root    /usr/share/nginx/html;
    try_files  $uri $uri/ /index.html?/$request_uri;
}

这是 nginx 配置导致的问题吗?我该如何解决这个问题?

更新:根本原因是由于 3xx 重定向的服务工作者行为(通常发生在登录/身份验证期间)。是否可以让服务人员与 IAP 一起工作?

谢谢你。

4

2 回答 2

1

必须完成两个步骤才能让服务人员使用 GCP IAP。

  1. 参考https://github.com/facebook/create-react-app/issues/2237,我通过在我的纱线构建脚本中添加以下脚本解决了这个问题:

    const fs = require('fs')
    fs.readFile('build/service-worker.js', 'utf8', (error, data) => {
        if (error) {
            return console.log(error)
        }
    
        const result = data.replace(/isPathWhitelisted\(\[[^\]]+/g, 'isPathWhitelisted(["^(?!\\\\/_).*"');
        fs.writeFile('build/service-worker.js', result, 'utf8', (error) => {
            if (error) {
                return console.log(error)
            }
        })
    })
    

    我正在使用create-react-app构建我的应用程序。显然,默认创建的 service workercreate-react-app绕过了对 IAP 的请求。因此,我将现有的路径白名单模式替换为一个新模式:/^(?!\/_).*/以防止 service worker 绕过对 IAP 的请求,因为 IAP 中的特殊 url 都以下划线为前缀_

  2. 通过修改 Nginx 配置禁用 service-worker 缓存。

    location / {
    root    /usr/share/nginx/html;
        try_files   $uri /index.html;
    
        # disable service worker from being cached 
        location = /service-worker.js {
            expires off;
            add_header Cache-Control no-store;
            access_log off;
        }
    }
    
于 2018-07-11T07:45:49.313 回答
0

我们实际上可以使用这个选项:

  1. 如果我们真的不需要渐进式 Web 应用程序,请禁用 service worker
  2. 使用 nginx 配置,在我的情况下,我使用 kubernetes 来部署我的后端和前端,所以http://foo.bar will代表我foo deployment位于bar namespace. 该$domain变量将在部署运行时使用替换进行替换:
    服务器 {
      听 80;
      根 /usr/share/nginx/html;

      重写 /_gcp_iap/[a-z_]*$ $domain 永久;

      地点 / {
        try_files $uri /index.html;
      }

      位置 /foo/bar {
        # 后端服务的代理通行证
        proxy_pass http://foo.bar;
      }
    }

要调试您的服务工作者应用程序,您实际上可以使用 google chrome:

chrome://inspect/#service-workers

于 2018-07-19T09:43:12.560 回答