certify-origin.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { ErrorV3 } from '@growi/core/dist/models';
  2. import type { NextFunction, Response } from 'express';
  3. import type Crowi from '~/server/crowi';
  4. import type { AccessTokenParserReq } from '~/server/middlewares/access-token-parser/interfaces';
  5. import isSimpleRequest from '~/server/util/is-simple-request';
  6. import loggerFactory from '~/utils/logger';
  7. const logger = loggerFactory('growi:middleware:certify-origin');
  8. type Apiv3ErrFunction = (error: ErrorV3) => void;
  9. const certifyOrigin = (crowi: Crowi): ((req: AccessTokenParserReq, res: Response & { apiv3Err: Apiv3ErrFunction }, next: NextFunction) => void) => {
  10. const appSiteUrl = crowi.configManager?.getConfig('app:siteUrl');
  11. return (req: AccessTokenParserReq, res: Response & { apiv3Err }, next: NextFunction): void => {
  12. const isSameOriginReq = req.headers.origin == null || req.headers.origin === appSiteUrl;
  13. req.isSameOriginReq = isSameOriginReq;
  14. const accessToken = req.query.access_token ?? req.body.access_token;
  15. if (!isSameOriginReq && req.headers.origin != null && isSimpleRequest(req)) {
  16. const message = 'Invalid request (origin check failed but simple request)';
  17. logger.error(message);
  18. return res.apiv3Err(new ErrorV3(message));
  19. }
  20. if (!isSameOriginReq && accessToken == null && !isSimpleRequest(req)) {
  21. const message = 'Invalid request (origin check failed and no access token)';
  22. logger.error(message);
  23. return res.apiv3Err(new ErrorV3(message));
  24. }
  25. next();
  26. };
  27. };
  28. export default certifyOrigin;