Puncte:1

Controlul accesului bazat pe chei pentru fișierele private

drapel jp

Construiesc un site care oferă conținut video plătit, pentru încorporare în site-urile proprii ale clienților. Controlez cu succes accesul la nodurile care conțin conținut video pe baza rolurilor de utilizator care pot fi achiziționate.

Acum trebuie să ofer utilizatorilor un cod de încorporare care, în mod ideal, ar funcționa numai din domeniul lor.Deocamdată m-aș bucura doar să-l pot limita la anumiți utilizatori.

Am instalat modulele key_auth și restui și am activat resursa REST „fișier”. Acum pot accesa informații *despre* fișier ca utilizator anonim cu cheia API a abonatului plătitor în interogare. Cu toate acestea, nu pot accesa fișierul real.

Informațiile pe care le primesc sunt mai jos.

{"fid":[{"value":3}],"uuid":[{"value":"5655ecda-b421-4ab8-aa92-d43c6c0fbfdf"}],"langcode":[{"valoare":" ro"}],"uid":[{"target_id":1,"target_type":"user","target_uuid":"58d862eb-86e9-4ec6-bb33-89bda5c1767a","url":"\/user\ /1"}],"filename":[{"value":"file_example_MP4_480_1_5MG.mp4"}],"uri":[{"value":"privat:\/\/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":[ {"value":1570024}],"status":[{"value":true}],"created":[{"value":"2022-04-16T15:52:39+00:00"," format":"Y-m-d\TH:i:sP"}],"schimbat":[{"value":"2022-04-16T15:52:43+00:00","format":"Y-m-d\ Acest p"}]}

Cum pot avea acces la videoclipul real în acest fel?

apaderno avatar
drapel us
Înțeleg că prin *obține acces la videoclipul real* te referi la obținerea adresei URL a videoclipului. Deoarece utilizați un API REST, accept și că solicitarea nu vine de pe site-ul Drupal. Calea relativă a videoclipului este dată în `uri.url`. La aceasta, trebuie să adăugați adresa URL a site-ului. De exemplu, dacă acesta este „http://example.com/drupal”, acea adresă URL a videoclipului ar fi „http://example.com/drupal/system/files/2022-04/file_example_MP4_480_1_5MG.mp4”. Deoarece codul face o solicitare REST, știe adresa URL la care este trimisă solicitarea, ceea ce înseamnă, de asemenea, că poate obține partea lipsă din calea video pentru a-l transforma într-o adresă URL completă.
apaderno avatar
drapel us
Sau întrebați *Pe partea Drupal, cum modific valorile returnate de API-ul REST pentru a include adresa URL absolută a videoclipului?*
apaderno avatar
drapel us
Alternativ, *obțineți acces la videoclipul real* înseamnă doar că accesarea videoclipului folosind adresa URL din afara Drupal returnează o eroare 403 și doriți să știți cum să evitați asta. Deoarece videoclipul este salvat ca fișier privat, pe partea Drupal accesul la acele fișiere este controlat de [`hook_file_download()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core% 21File%21file.api.php/function/hook_file_download/9.3.x). Modul în care o implementare a acelui cârlig ar înțelege fișierul este solicitat de un *client* care utilizează API-ul REST pentru a accesa informațiile este întrebarea „adevărată”, în acest caz.
Alfred Armstrong avatar
drapel cn
Dacă videoclipul urmează să fie încorporat pe site-ul clientului, oricine vizionează videoclipul trebuie neapărat să aibă acces.Probabil că puteți împiedica încorporarea acestuia pe site-uri neautorizate, deoarece majoritatea browserelor vor respecta antetele politicii de securitate a conținutului, dar dacă videoclipul este servit ca fișier, nu puteți împiedica copierea și apoi difuzarea lui pe alte platforme.
griz avatar
drapel jp
@AlfredArmstrong Da, după ce am ajuns la limitele descrise în răspunsul meu, acest lucru a devenit evident. Din acest motiv, mă uit acum la utilizarea unei platforme de găzduire video care oferă protecție împotriva acestui lucru, dar a fost o călătorie interesantă.
griz avatar
drapel jp
@apaderno Vă mulțumim pentru eforturile dvs. Ceea ce încercam să fac este să creez un punct final de odihnă care pur și simplu returnează fișierul. Acest lucru ar duce fie la o descărcare dacă cererea GET este făcută printr-un browser, fie la afișarea fișierului într-o pagină dacă este utilizat într-un atribut src.
Puncte:0
drapel jp

A trebuit să scriu un modul personalizat cu următoarea structură: video_resource.info.yml src/Plugin/Deriver/VideoDeriver.php src/Plugin/rest/resource/VideoResource.php

Restul resursă și derivatul de entitate sunt copii tăiate ale EntityResource și EntityDeriver:

\Drupal\rest\Plugin\rest\resource\EntityResource \Drupal\rest\Plugin\Deriver\EntityDeriver

Aceste clase împreună creează o resursă de odihnă pentru fiecare tip de entitate. Am setat-o ​​pe a mea să creeze doar o resursă rest pentru tipul de entitate „File”, cu următorul cod în funcția sa get():

$filepath = $entity->getFileUri(); $răspuns = nou BinaryFileResponse($filepath); returnează $răspuns;

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.