docker 如何通过sameSite:没有来自Azure AppService上运行的停靠节点应用程序的内容?

xdyibdwo  于 2022-11-03  发布在  Docker
关注(0)|答案(2)|浏览(131)

我有几个节点应用程序在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修复了这个问题之后,我如何在开发中运行它?

km0tfn4u

km0tfn4u1#

在AppService中,SSL终止发生在网络负载平衡器上,因此所有HTTPS请求都以未加密的HTTP请求的形式到达您的应用。但是,SameSite=None必须为secure,即Cookie只能通过HTTPS发送。如果secure设置为true,并且Node.js不是直接通过TLS连接(如本例中所示),您需要正确设置受信任的代理,以便传递X-Forwarded-*标头并正确设置cookie。请在Express应用程序引导过程中设置以下内容。

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

您提到您尝试了app.set('trust proxy', 1),这意味着它仅用于第一个跃点。在这种情况下,我们需要2个跃点来包括网络负载平衡器之外的容器入口。有关详细信息,请参阅this
然后在我为Azure修复了这个问题之后,我如何在开发中运行它?
如果设置app.set('trust proxy', 2);,我相信本地调试不需要任何特殊处理。

jhiyze9q

jhiyze9q2#

正如@krishg所指出的,你的应用程序运行在Azure负载平衡器之后,而Azure负载平衡器被视为代理。
如果使用express-sessions,则可以在选项中设置proxy=true

var sessionOptions = {
    secret: process.env.SESSION_SECRET,
    store: MongoStore.create(MongoStoreOptions),
    saveUninitialized: true,
    rolling: true,
    proxy: true, // <- Important for Azure
    cookie: {
        maxAge: sessionCookieTime,
        secure: true,
        sameSite: 'None',
        }
    }

也可以在创建sessionOptions对象后根据环境设置该属性。

if (app.get('env') === 'production') {
    sessionOptions.proxy = true;
}

相关问题