Wykorzystanie modułu http_secure_link w PHP

0

Witam, muszę wykorzystać moduł Nginx http_secure_link do generowania linków do video składowanych na FTP, jednakże nie wiem jak to ugryźć. Czy są jakieś gotowe zastosowania do PHP? Czytając to: http://nginx.org/en/docs/http/ngx_http_secure_link_module.html
Nie mam pojęcia jak tego użyć do linkowania video w aplikacji w PHP. Czy ktoś może mniej więcej mnie naprowadzić co zrobić żeby serwować video na stronie za pomocą tego modułu?

Pozdrawiam

1

Zasada działania jest taka:

  1. Po stronie php generujesz unikatowy link w stylu
<?php
$expires = time()+60; //60sekund wazny
$key =  md5("/files/sasha_grey_bathroom.webp{$expires} <sekretny klucz>");//uwazaj na spacje!
echo "<a href='/files/sasha_grey_bathroom.webp?md5={$key}&amp;expires={$expires}'>download</a>";
  1. Następnie ustawiasz w ustawieniach nginxa
location /files/ {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$uri$secure_link_expires <sekretny klucz>";

    if ($secure_link = "") {
        return 403;
    }

    if ($secure_link = "0") {
        return 410;
    }


}
  1. I tylko wyłącznie zostanie plik pobrany, jeśli użytkownik odgadnie hash ;)
    4.76 - JKM
0

@bordeux

Zrobiłem tak jak pokazałeś:

W kontrolerze mam metodę

public function showVideo($id){
        $video = Video::findOrFail($id);
        $expires = time()+60;
        $key = md5($video->path.$expires." abc");
        return view('videos.video', compact('video', 'expires', 'key'));
    } 

Następnie w widoku robię coś takiego:

 
<source src="{{$video->path."?md5=".$key."&amp;expires=".$expires}}" type='video/mp4' />

A w konfiguracji ngina mam tak:

server {
  listen        80;
  server_name   www.mysite.com mysite.com;

  location / {
        root /var/www/videos;
   secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$uri$secure_link_expires abc";

    if ($secure_link = "") {
        return 403;
    }

    if ($secure_link = "0") {
        return 410;
    }


    autoindex on;
  }
}

 

Niestety to nie działa. Czy popełniłem gdzieś błąd?

0

Co masz na myśli że nie działa? Jakiś error log, kod odpowiedzi jakiś?

zrób jeszcze

<?php
$md5 = base64_encode($md5); 

aby wyeliminować wątpliwość

0
bordeux napisał(a):

Co masz na myśli że nie działa? Jakiś error log, kod odpowiedzi jakiś?

Serwer nie zwraca pliku, wyskakuje 403.

@bordeux

Po zmianie na:

  $video = Video::findOrFail($id);
        $expires = time()+60;
        $key = md5($video->path.$expires." abc");
        $md5 = base64_encode($key);

Problem nadal występuje.

1

To jest poprawna funkcja do generowania md5 klucza:

<?php
$string = "2147483647/s/link127.0.0.1 secret";

$md5 =  base64_encode(md5($string, true));
$replaces = [
        "+" => "-",
        "/" => "_",
        "=" => ""
    ];
$md5 = str_replace(array_keys($replaces), array_values($replaces), $md5);
echo $md5;

Tak jak w dokumentacji:

echo -n '2147483647/s/link127.0.0.1 secret' | \
    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
0

@bordeux

Teraz pytanie: jeśli $video->path zwraca przykładowo: "http://10.10.10.10/XXX/XXX.mp4" to przy takim generowaniu md5 będzie ok? Plik jest na innym serwerze niż aplikacja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1