• Home
  • About
    • lahuman photo

      lahuman

      열심히 사는 아저씨

    • Learn More
    • Facebook
    • LinkedIn
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

swagger-node에서 express-session 설정 & 사용하기

22 May 2020

Reading time ~2 minutes

swagger-node에서 express-session 설정 & 사용하기

기본적으로 swagger-node는 express를 기반으로 동작합니다.

swagger-node는 API 용으로 이용하기 때문에 기본적으로 session을 발행하지 않습니다.

다만 필요에 따라 로그인 프로세스 구현을 하게 될 경우 다음 라이브러리를 이용해야 합니다.

  • express-session
  • body-parser

app.js 코드에 다음과 같이 설정을 하면 세션을 이용할수 있습니다.

express 4.X 부터는 body-parser를 사용하지 않고 express에서 제공되는 것을 이용합니다. 또한 app.use(express.urlencoded({ extended: true })); 을 사용하면 fileupload 처리를 이전과 같이 사용할 수 없습니다. 아래 multer를 이용한 예제를 참고 하셔요.

app.use(
  require("express-session")({
    secret: "keyboard cat",
    cookie: {
      maxAge: 1000 * 60 * 60 , // 1 hour
    },
    resave: false,
    saveUninitialized: false,
  })
);
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

추가로 session 관리를 passport를 이용해서 쉽게 관리 할수 있습니다.

다음 예제는 SSO의 방식중 하나인 SAML으로 처리한 예제를 준비 하였습니다.

예제 코드 바로 보기

주요점은 passport는 express-session에서만 동작 하기 때문에 세션 설정을 잘해야 합니다.

Multer를 이용한 첨부 파일 uploade

app.use(express.urlencoded({ extended: true }));를 설정하면, formData를 바로 접근하지 못하게 됩니다. 이때 다음 샘플을 기준으로 첨부파일을 처리 할 수 있습니다.

// multer 설정
const multer = require("multer");
const storage = multer.diskStorage({
  // upload path
  destination: function (req, file, cb) {
    cb(null, "tempfiles");
  },
  // 업로드된 파일 이름
  filename: function (req, file, cb) {
    cb(null, `${moment().format("YYYYMMDDHHmmssSSS")}${file.originalname}`);
  },
});

const upload = multer({
  storage: storage,
  limits: { fileSize: 10 * 1024 * 1024 },
});

... 설정 처리

SwaggerExpress.create(config, function (err, swaggerExpress) {
  if (err) {
    throw err;
  }
  // swagger-node에서 미들웨어 처리 방법
  app.use(
      "/jira/attachments/upload",
      upload.single("filepond"),
      async (req, res, next) => {
        try {
          const file = req.file;
          res.status(201).json({
            status: "OK",
            file_nm: file.originalname.normalize("NFC"),
            file_path: file.filename,
          });
        } catch (e) {
          logger.error(e);
          res.status(400).json({ status: "ERROR", message: e });
        }
      }
    );
});

주요 코드만 표기 하였습니다. 예제 코드 바로 보기의 app.js를 참고 하면 전체 코드를 작성하실수 있습니다.

참고 자료

  • swagger-node
  • express
  • passport
  • passport’s req.isAuthenticated always returning false, even when I hardcode done(null, true)


nodeswaggersession Share Tweet +1