Подавать статическое JS-приложение из каталога в Laravel для авторизованных пользователей

У меня есть JS-приложение. У него есть собственный каталог, и все, что ему нужно, находится в этом каталоге. Я хочу использовать это приложение в проекте Laravel сейчас. Но он должен быть доступен только для зарегистрированных пользователей. Теперь я не знаю, как это сделать. Я бы использовал cookie-аутентификацию, но как она должна работать? Если приложение JS находится в общедоступном каталоге, оно всегда открыто для доступа и не имеет доступа к токену csrf. Если он находится в ресурсах, я могу предоставить только отдельные файлы для просмотра. Как я могу сделать весь каталог доступным? На данный момент я вижу только один вариант:

веб.php

Route::middleware(['auth:sanctum', 'verified'])->get('/jsapp', function () {
    return view("jsapp");
})->name('jsapp');

Route::middleware(['auth:sanctum', 'verified'])->get('/jsapp/{path?}', function (Request $req, $path) {
    return serve_file_somehow("path_to_project_root", $path);
});

Это Js-приложение регулярно опрашивает сервер, чтобы проверить, вошел ли пользователь в систему. Мой вопрос, как реализовать эту функцию serve_file_somehow? Или, может быть, есть другие решения для этой ситуации? Есть ли какая-то магия .htaccess, которую можно реализовать?

Структура каталогов Js-приложения:

resources/views/jsapp
-- index.html
    <html>
        <link href="css/styles.css" />
        <script src="js/index.js />
    </html>
-- css/styles.css
-- js/index.js
-- images/img1.jpg

Что меня беспокоит, так это то, что вы переопределяете функции веб-сервера через PHP/Laravel.


person Tony    schedule 17.10.2020    source источник


Ответы (2)


Вы должны передавать содержимое файла index.html через шаблон блейда index.blade.php

<html>
  <meta name="csrf-token" content="{{ csrf_token() }}">
  <link href="/css/styles.css" />
  <script src="/js/index.js />
</html>

с защищенным маршрутом:

Route::middleware(['auth:sanctum', 'verified'])->get('/jsapp', function () {
    return view("jsapp.index");
})->name('jsapp');

и поместите все файлы javascript и css в каталог public.

person BeS    schedule 17.10.2020
comment
круто мне нравится эта идея. Небольшим недостатком является то, что файлы js-App не находятся полностью в своем каталоге. Aber fehlende csrf_token и файл cookie verbieetet Zugriff на внутренних датах. - person Tony; 17.10.2020
comment
Упс, по-английски, пожалуйста :) И, конечно же, они всегда доступны, независимо от того, вошел пользователь в систему или нет. Но отсутствие csrf_token и cookie запрещает доступ к внутренним данным. - person Tony; 17.10.2020
comment
Намеренно предложил сделать сценарии общедоступными, потому что это обычный способ. Таким образом, среди прочего, он обеспечивает лучший контроль кэширования. Если речь идет о безопасности, это должно касаться API/внутренних данных. - person BeS; 17.10.2020

Также возможно получить CSRF-токен через XSRF-TOKEN cookie, который Laravel устанавливается автоматически. Если у вас нет доступа к каталогу ресурсов или вы хотите, чтобы все ваше JS-приложение было в одном каталоге. Тогда вы также можете использовать этот метод.

 <script>
    $.ajaxSetup({
        headers: {
            'X-XSRF-TOKEN': $.cookie('XSRF-TOKEN')
        }
    });
 </script>
person Tony    schedule 17.10.2020