如何从 Azure AppService 上的 Dockerized Node 应用 运行 传递 sameSite: none?

How to pass sameSite: none from Dockerized Node app running on Azure AppService?

我有几个节点应用程序 运行 在 Docker 容器中托管在 Azure AppServices 上。

我正在尝试弄清楚如何处理 SameSite cookie 问题,但为此我需要 https。目前,Node/Express 应用程序在容器内 运行ning http,然后 Azure 将我们的证书附加到 AppService 到 运行 https。

我们正在使用具有以下选项的 cookie-session:

app.use(
  cookieSession(
    {
      name: 'session',
      keys: [ '123456789ABCD' ],
      // Cookie Options
      maxAge:   24 * 60 * 60 * 1000,  // 24 hours
      httpOnly: true,
      sameSite: 'none',
      secure:   true
    }
  )
)

sameSite: 'none'secure: true 是新的,但是每当我部署 secure: true 时我的应用程序就会崩溃,因为我没有在容器内 运行ning http,所以饼干被剥离。

我也试过app.set('trust proxy', 1),但看不出有什么影响。

Docker文件:

# Create a container image for the app
FROM node:erbium-alpine

# Allow NODE_ENV to be set to different values
# depending on the image build/deployment environment
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

# Create app directory
WORKDIR /usr/app

# Copy package.json and yarn.lock into app directory
COPY ./package.json ./
COPY ./yarn.lock ./

# Install backend NPM modules
RUN yarn install

# COPY the client package and yarn files into app
COPY ./client/package.json ./client/
COPY ./client/yarn.lock ./client/

# Install client NPM modules
RUN yarn run install:client

# COPY the rest of the files into app directory
COPY ./ ./

# build the client
RUN yarn run build:client

# Expose ports for accessing the app
EXPOSE 5000 80

# Launch the Express server
CMD ["node", "server.js"]

对于这种部署方案,什么是好的方法?我是否将一些自签名证书添加到容器中,或者我只是在某处缺少设置?

然后在我为 Azure 修复此问题后,如何在开发中运行它?

在 AppService 中,SSL 终止发生在网络负载平衡器上,因此所有 HTTPS 请求都作为未加密的 HTTP 请求到达您的应用程序。但是,SameSite=None 必须是 secure 即cookie 只能通过 HTTPS 发送。如果 secure 设置为 true 并且 Node.js 不是像这种情况那样直接通过 TLS 连接,您需要正确设置可信代理以便 X-Forwarded-* headers 被传递并且 cookie 被正确设置。在您的快速应用引导过程中设置以下内容。

app.set('trust proxy', 2);

您提到您尝试了 app.set('trust proxy', 1),这意味着它仅适用于第一跳。在这种情况下,除了网络负载均衡器之外,我们需要 2 个跃点来包括容器的入口。详情参考this.

And then after I fix this for Azure, how do I run it in development?

如果你设置app.set('trust proxy', 2);,相信你本地调试就不需要什么特殊处理了。