我有几个节点应用程序在Azure AppServices上托管的Docker容器中运行。
我正在尝试找出如何处理SameSite cookie问题,但要做到这一点,我需要https。目前,Node/Express应用程序在容器内运行http,然后Azure将我们的证书附加到AppService以运行https。
我们正在使用带有以下选项的cookie会话:
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
是新增的,但每当我部署安全:false破坏了我的应用程序,因为我没有在容器内运行http,所以cookie被剥离。
我也试过app.set('trust proxy', 1)
,但看不出它有任何影响。
停靠文件:
# 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修复了这个问题之后,我如何在开发中运行它?
2条答案
按热度按时间km0tfn4u1#
在AppService中,SSL终止发生在网络负载平衡器上,因此所有HTTPS请求都以未加密的HTTP请求的形式到达您的应用。但是,
SameSite=None
必须为secure
,即Cookie只能通过HTTPS发送。如果secure
设置为true
,并且Node.js不是直接通过TLS连接(如本例中所示),您需要正确设置受信任的代理,以便传递X-Forwarded-*
标头并正确设置cookie。请在Express应用程序引导过程中设置以下内容。您提到您尝试了
app.set('trust proxy', 1)
,这意味着它仅用于第一个跃点。在这种情况下,我们需要2个跃点来包括网络负载平衡器之外的容器入口。有关详细信息,请参阅this。然后在我为Azure修复了这个问题之后,我如何在开发中运行它?
如果设置
app.set('trust proxy', 2);
,我相信本地调试不需要任何特殊处理。jhiyze9q2#
正如@krishg所指出的,你的应用程序运行在Azure负载平衡器之后,而Azure负载平衡器被视为代理。
如果使用express-sessions,则可以在选项中设置proxy=true
也可以在创建sessionOptions对象后根据环境设置该属性。