Только перенаправлять неаутентифицированных пользователей для отсутствующих ресурсов в Koa.js?

В моем приложении используется Koa.js с koa-passport для логики аутентификации. Как я это настроил, промежуточное ПО (паспорт) вставляется между общедоступным контентом (js, css, img и т. д.), или, точнее, static промежуточное ПО и частные контроллеры (используя trie-router< /а>). Затем запрос просто перенаправляется на URL-адрес для входа, если пользователь, не прошедший проверку подлинности, пытается получить доступ к маршрутизатору.

Теперь проблема заключается в том, что когда некоторые изображения отсутствуют в папке общедоступных ресурсов, я получаю доступ к промежуточному программному обеспечению аутентификации и снова перенаправляюсь на URL-адрес входа. Это проблематично, так как я получаю несколько перенаправлений 302 в своих журналах, и я хотел бы предотвратить это.

Можно ли в любом случае безопасно знать, что запрос будет соответствовать маршруту внутри trie-маршрутизатора в качестве предварительного условия для перенаправления, иначе вместо этого будет возвращено 404?


person Yanick Rochon    schedule 30.12.2014    source источник


Ответы (2)


Можете ли вы опубликовать свой код конфигурации?

Маршруты по-прежнему сопоставляются на пути, поэтому, если вы монтируете промежуточное ПО для аутентификации только на этих путях, оно должно работать должным образом. НАПРИМЕР:

app.use('/private', passport.authenticate());
person Paul    schedule 30.12.2014
comment
Итак, вы предлагаете вместо того, чтобы монтировать паспорт в качестве промежуточного программного обеспечения непосредственно в приложении, я должен составить его с каждым частным маршрутом? - person Yanick Rochon; 30.12.2014
comment
Да. С точки зрения информационной архитектуры, нередко все частные маршруты находятся под парой корневых путей или, возможно, шаблонов путей. Хотя, если вас беспокоит каждый, вы можете попробовать выполнить сопоставление путей регулярных выражений для точки монтирования, чтобы сэкономить место в конфигурации. - person Paul; 30.12.2014
comment
Я понимаю. У меня не так много маршрутов такого, но я избегал ненужного повторения сочинения. Но, в конце концов, лень всегда будет неправильным подходом :) - person Yanick Rochon; 30.12.2014
comment
вам не нужно повторять их так много, особенно. если они у вас есть на каком-то пути. Алгоритм сопоставления является жадным, поэтому, если у вас есть app.use('/private', passport.authenticate()), а затем вы можете сделать что-то вроде var private = new Router(); private.get('/private/some-resource', handler);, и это сработает. - person Paul; 30.12.2014
comment
Ой! Я не был уверен, что смогу смешать их... но я думаю, что маршрутизатор просто создает регулярное выражение (т. е. при использовании динамических шаблонов) для пути, а Коа просто проверяет, начинается ли строка с, так ли это? - person Yanick Rochon; 30.12.2014

Таким образом, похоже, что статическое промежуточное ПО уступает, если не может найти файл.

Вы можете написать собственное промежуточное ПО, такое как fileNotFound() ниже, которое вы будете использовать после статики и перед контроллерами.

Что-то вроде:

var serve = require('koa-static');

function fileNotFound(rootPath){
  var pattern = new RegExp('^' + rootPath + '/.*/')
  return function *(next){
    if(pattern.test(this.path)){
      this.throw(404);
    }
    else{
      yield next;
    }
  }
}
app.use(serve('/public'));
app.use(fileNotFound('/public'));

// add controllers after this
person James Moore    schedule 30.12.2014
comment
Это не сработает, так как после статического промежуточного программного обеспечения есть маршрутизатор, а маршруты также могут быть динамическими (с использованием trie-маршрутизатора). Комментарии под ответом Paul - правильный способ сделать это. - person Yanick Rochon; 30.12.2014