Рейтинг:1

Контроль доступа на основе ключей для личных файлов

флаг jp

Я создаю сайт, который предоставляет платный видеоконтент для встраивания в собственные сайты клиентов. Я успешно контролирую доступ к узлам, содержащим видеоконтент, на основе приобретаемых ролей пользователей.

Теперь мне нужно предоставить пользователям код для встраивания, который в идеале будет работать только из их домена.На данный момент я был бы счастлив просто иметь возможность ограничить его для определенных пользователей.

Я установил модули key_auth и restui и включил ресурс REST «файл». Теперь я могу получить доступ к информации *о* файле как анонимный пользователь с API-ключом платного подписчика в запросе. Однако я не могу получить доступ к фактическому файлу.

Информация, которую я получаю, приведена ниже.

{"fid":[{"value":3}],"uuid":[{"value":"5655ecda-b421-4ab8-aa92-d43c6c0fbfdf"}],"langcode":[{"value":" en"}],"uid":[{"target_id":1,"target_type":"пользователь","target_uuid":"58d862eb-86e9-4ec6-bb33-89bda5c1767a","url":"\/user\ /1"}],"имя файла":[{"значение":"file_example_MP4_480_1_5MG.mp4"}],"uri":[{"значение":"частное:\/\/2022-04\/file_example_MP4_480_1_5MG.mp4" ,"url":"\/system\/files\/2022-04\/file_example_MP4_480_1_5MG.mp4"}],"filemime":[{"value":"video\/mp4"}],"filesize":[ {"значение":1570024}],"статус":[{"значение":true}],"создано":[{"значение":"2022-04-16T15:52:39+00:00"," формат":"Г-м-д\TH:i:sP"}],"изменен":[{"значение":"2022-04-16T15:52:43+00:00","формат":"Г-м-д\ TH:i:sP"}]}

Как я могу получить доступ к реальному видео таким образом?

apaderno avatar
флаг us
Я так понимаю, что под *получить доступ к реальному видео* вы подразумеваете получение URL-адреса видео. Поскольку вы используете REST API, я также понимаю, что запрос поступает не с сайта Drupal. Относительный путь к видео указан в uri.url. К этому вам нужно добавить URL-адрес сайта. Например, если это `http://example.com/drupal`, этот URL видео будет `http://example.com/drupal/system/files/2022-04/file_example_MP4_480_1_5MG.mp4`. Поскольку код выполняет запрос REST, он знает URL-адрес, на который отправляется запрос, что также означает, что он может получить недостающую часть пути к видео, чтобы сделать его полным URL-адресом.
apaderno avatar
флаг us
Или вы спрашиваете *На стороне Drupal, как мне изменить значения, возвращаемые REST API, чтобы включить абсолютный URL-адрес видео?*
apaderno avatar
флаг us
В качестве альтернативы *получить доступ к фактическому видео* просто означает, что доступ к видео с использованием его URL-адреса из-за пределов Drupal возвращает ошибку 403, и вы хотите знать, как этого избежать. Поскольку видео сохраняется как частный файл, на стороне Drupal доступ к этим файлам контролируется [`hook_file_download()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core% 21File%21file.api.php/function/hook_file_download/9.3.x). Как реализация этого хука поймет, что файл запрошен *клиентом*, который использует REST API для доступа к информации, в данном случае является «настоящим» вопросом.
Alfred Armstrong avatar
флаг cn
Если видео будет встроено на клиентский сайт, любой, кто просматривает видео, обязательно должен иметь доступ.Вероятно, вы можете предотвратить его встраивание на неавторизованные сайты, поскольку большинство браузеров будут соблюдать заголовки политики безопасности контента, но если видео предоставляется в виде файла, вы не можете предотвратить его копирование и последующее использование на других платформах.
griz avatar
флаг jp
@AlfredArmstrong Да, после того, как я приложил все усилия, описанные в моем ответе, это стало очевидным. По этой причине я сейчас рассматриваю возможность использования платформы видеохостинга, которая обеспечивает защиту от этого, но это был интересный путь.
griz avatar
флаг jp
@apaderno Спасибо за ваши усилия. Я пытался создать конечную точку отдыха, которая просто возвращает файл. Это приведет либо к загрузке, если запрос GET сделан через браузер, либо к файлу, отображаемому на странице, если он используется в атрибуте src.
Рейтинг:0
флаг jp

Мне пришлось написать собственный модуль со следующей структурой: video_resource.info.yml src/Plugin/Производный/VideoDeriver.php src/Plugin/остальные/ресурс/VideoResource.php

Остальные ресурсы и производные объекты являются урезанными копиями EntityResource и EntityDeriver:

\Drupal\rest\Plugin\rest\resource\EntityResource \Drupal\остальное\плагин\деривер\энтитидеривер

Эти классы вместе создают ресурс отдыха для каждого типа сущности. Я настроил свой так, чтобы он создавал только ресурс отдыха для типа объекта «Файл» со следующим кодом в его функции get():

$filepath = $entity->getFileUri(); $response = новый BinaryFileResponse($filepath); вернуть $ответ;

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.