Промежуточное программное обеспечение LoopbackJS (экспресс) (auth0) не работает на производстве, но работает в локальной среде - PullRequest
0 голосов
/ 04 марта 2019

У меня есть промежуточное программное обеспечение, отвечающее за авторизацию: loopback-auth-jwt , и я хочу применить его к большинству конечных точек, но не ко всем.Некоторые из конечных точек должны быть доступны, но если запрос имеет токен доступа, его следует использовать для аутентификации.Поэтому я написал промежуточное программное обеспечение, которое должно проверять токен и, если он есть, авторизовать пользователя, в противном случае он ничего не должен делать, поэтому пользователь будет считаться анонимным.Он отлично работает в локальной среде, но не работает на удаленном сервере.Честно говоря, я даже не знаю, как это отладить.Вот мое промежуточное программное обеспечение (это не код 1 к 1, но общая концепция здесь):

// Define routes that should be public and not protected by auth0 by default.
const EXCLUDED_ROUTES = [
  '/api/projects/',
  '/api/tasks/[a-z0-9]*',
  '/api/projects/(task)/[a-z0-9]*'
];

module.exports = server => {
  const auth0Jwt = require('loopback-auth0-jwt');
  const jwtDecode = require('jwt-decode');

  const authConfig = {
    // ...
  };

  const auth = auth0Jwt(server, authConfig);

  // Check if given URL should be considered as public or private route.
  // This function is working as desired.
  const isPublicRoute = url => {
    let isPublic = false;
    EXCLUDED_ROUTES.map(route => route.replace('/', '/')).forEach(pattern => {
      const regex = new RegExp(pattern);
      if (regex.test(url)) {
        isPublic = true;
      }
    });
    return isPublic;
  };

  // Middleware that depend on the result of isPublicRoute function applies auth0 middleware or not.
  const authMiddleware = async (req, res, next) => {
    const path = req._parsedUrl.pathname;

    if (isPublicRoute(path)) {
      // validate reuqest headers
      if (!(req.headers && req.headers.authorization)) return next();

      // ... some additional checks

      const userWithToken = await server.models.User.findOne({where: { email: userEmail }, include: ['accessTokens']});

      // no token was found, so we need to login user.
      if (!userWithToken.accessToken) {
        accessToken = await server.models.User.login({
          // data
        });
      }
      if (accessToken) {
        req.accessToken = accessToken;
        next();
      } else {
        next();
      }
    } else {
      // route is not public - apply auth0 middelware.
      server.use(path, auth.authenticated);
      next();
    }
  };

  // apply authMiddleware
  server.use(authMiddleware);

  server.enableAuth();
};

1 Ответ

0 голосов
/ 06 марта 2019

Итак, мы определили проблему.Согласно петлевой документации, server.use(path, auth.authenticated) добавит промежуточное программное обеспечение, но, поскольку оно является промежуточным промежуточным ПО, оно не контролирует порядок выполнения промежуточного программного обеспечения, поэтому были возвращены случайные результаты.Итак, мы переместили это в middleware.json и применили это промежуточное ПО на этапе auth, и оно работает как шарм.

...