我有一个 Azure 静态 Web 应用程序,为 React SPA 提供服务,并在自定义域(我们称之为 mysite.com)上连接了 Azure Functions 后端。它使用 Azure 基本身份验证(又名 EasyAuth)。现在我有一个为 Postgres 和 pg_tileserv 提供服务的虚拟机。在该虚拟机上,我在子域 (tiles.mysite.com) 上的 pg_tileserv 前面有 oauth2_proxy。如果我在浏览器中打开tiles.mysite.com,那么我可以很好地进行身份验证,并且在独立的基础上,它可以工作。
我希望能够从 Web 应用程序的虚拟机中获取图块,但我无法从主站点上的会话对tileserv 进行身份验证。
我尝试在 mysite.com 上添加一个转到tiles.mysite.com 的 iframe。 iframe 将从现有 cookie 登录,无需用户干预,但当我获取图块时,它不会将这些 cookie 带到获取请求中,因此这些请求会失败(获取 302)。
我知道我可以将 nginx 和 uvicorn 放在我的虚拟机上,并在那里托管 webapp 和 api,以便所有身份验证都集中在一个地方,但我有点喜欢资源分离。
我对几乎任何其他方法都持开放态度。不过,我宁愿不必订阅更多 Azure 服务(例如 Front Door)。如果可以以某种方式解决我的问题,我不介意从 oauth2_proxy 切换或添加 nginx。
从逻辑上讲,您的 Web 应用程序应该能够调用 API 来获取数据。您当前的架构似乎阻止了这种情况:
API 将放置在您的 VM / Postgres 组件前面,并且需要访问令牌。
但是使用 OAuth 代理可以防止这种情况,因为它会拒绝任何 API 请求。
所以我会关注这种方法:
客户端始终负责触发用户登录。
API 提供数据并且只需要访问令牌。他们可以返回 HTTP 401 状态代码来指示客户端何时需要触发登录。
一个好的第一步可能是引入像 NGINX 这样的 API 网关,正如您所建议的: