簡體   English   中英

在 Node/Express API 上禁用 Swagger

[英]Disable Swagger on Node/Express API

我正在使用 Swagger 在我的開發環境中記錄我的節點/Express API。 它運行良好,但現在我需要在生產時禁用它,以免公開訪問 API 定義。

有沒有辦法做到這一點,例如使用一些 npm 腳本?

謝謝

按照慣例,您想設置 NODE_ENV 環境變量(環境變量是在操作系統上設置的值,不依賴於您的應用程序)以使事情取決於您當前所在的環境。 這在很大程度上取決於您在何處托管生產應用程序。

  • 例如,如果是 AWS ECS 部署,則需要在 AWS Systems Manager Parameter Store 中進行設置。
  • 或者,如果它只是您通過 ssh 進入的普通雲實例,您可能會使用類似於node app.jsnpm run start運行您的應用程序(或者您可能正在使用 docker 並且您的腳本以這些命令之一結束。 ) 無論如何,在執行“運行應用程序”命令之前,請確保通過export NODE_ENV=production命令export NODE_ENV=production環境設置為生產。 您可以通過echo $NODE_ENV命令檢查它是否有效。
  • 或者,如果您使用 docker-compose,您可以將環境變量設置為: 它在這里說開發,但你會把它設置為生產

無論如何,一旦您確定 NODE_ENV 在應用程序在生產環境中運行時是生產環境,並且具有以下假設:

  • 您的應用程序在您的啟動文件中被命名為“app”,您將中間件定義為“app.use(...”
  • 你的招搖路線類似於“ http://localhost:PORT/docs

有了這些假設,使它成為代碼中第一個“app.use”類型的中間件定義:

if(process.env.NODE_ENV === "production"){
  app.use('/docs', (req, res, next) => {
    res.status(404).send("Not Found");
  });
}

如果我所做的任何假設與您的情況不相關,請相應地調整它們。 你已經完成了。

如果對swagger-UI使用swagger-express-mwswagger-tools

這就是我在 app.js 中做同樣的事情

if (process.env.NODE_ENV === 'development') {
  SwaggerExpress.create(config, function (err, swaggerExpress) {
    if (err) { throw err; }

    app.use(SwaggerUi(swaggerExpress.runner.swagger));
    // install middleware
    swaggerExpress.register(app);

    app.listen(PORT);
  });
} else {
  app.listen(PORT, () => console.log(`Server started @ Port - ${PORT}`));
}

除了禁用 Swagger UI 之外,您還可以選擇對其進行訪問保護。 以下是我們如何使用 HTTP Basic Auth 完成這兩項操作。 在您的main.ts或等效文件中,這里有一個使用 NEST 的 Node.js 應用程序:

const customNestApplication = (app: INestApplication) => {

  // [...]

  const swaggerEnabled = configService.get('swagger.enabled', { infer: true });

  if (
    swaggerEnabled &&
    configService.get('swagger.auth.user', { infer: true }) &&
    configService.get('swagger.auth.password', { infer: true })
  ) {
    app.use(
      `${configService.get('swagger.path', { infer: true })}`,
      basicAuth({
        challenge: true,
        users: {
          [configService.get('swagger.auth.user', { infer: true })]: 
          configService.get('swagger.auth.password', { infer: true }),
        },
      }),
    );
  }

  // Set up Swagger as usual, etc.
  // [...]

  return app.listen(port);
};

有關更多詳細信息,另請參閱另一個專門關於 Swagger 身份驗證的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM