如何从 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);
,相信你本地调试就不需要什么特殊处理了。
我有几个节点应用程序 运行 在 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);
,相信你本地调试就不需要什么特殊处理了。