Re: URL с временными токенами

Igor Sysoev igor на sysoev.ru
Чт Май 13 17:39:19 MSD 2010


On Thu, May 13, 2010 at 05:20:03PM +0400, Михаил Монашёв wrote:

> Здравствуйте, Максим.
> 
> >> > s> и особенно NginxHttpSecureDownload выглядят многообещающе.
> >> > 
> >> > Модуль Игоря будет работать при обновлении nginx-а. А вот модуль
> >> > сторонних разработчиков я б не использовал, хотя он и есть именно то,
> >> > что тебе нужно...
> >> 
> >> Я сейчас планирую добавить в ngx_http_secure_link_module функциональность
> >> с временем и finger print'ом. Что-то вроде
> >> 
> >> /prefix/MD5/TIME/FINGERPRINT/url
> >> /prefix/MD5/TIME/url
> >> /prefix/MD5/url
> >> 
> >> Для кодирования MD5, TIME и FINGERPRINT будет использоваться вариант
> >> base64 для URL (где "+" и "/" заменены на "-" и "_").
> >> 
> >> Директивы:
> >> 
> >>    secure_link_base64  [on|off|4|8|12];
> >> 
> >> off - совместимость с текущим ngx_http_secure_link_module.
> >> 4|8|12 - кодировать только часть хэша MD5.
> >> 
> >>    secure_link_expire  [on|off];
> >> 
> >>    secure_link_fingerprint  [off|строка];
> >>    secure_link_fingerprint 
> >> "$http_user_agent$remote_addr$http_accept";
> >> 
> >> FINGERPRINT считает MD5 от указанной строки и кодирует его в base64.
> >> 
> >> Ещё думаю над вариантом, когда MD5, TIME и FINGERPRINT передаются только
> >> в куке.
> 
> MD> Ещё pls подумай над вариантом передавать это всё в аргументах.  
> MD> Куки подходят не всегда, а настройка для аргументов(та) будет 
> MD> существенно проще и понятнее (не говоря уже о всякой последующей 
> MD> стастике и т.п.).
> 
> Угу. Источник для MD5, TIME и FINGERPRINT было бы удобно задавать.
> Например также, как сейчас задаётся secure_link_fingerprint

Тогда возможен такой вариант:

Формат ключа - MD5:TIME:FINGERPRINT 

MD5 считается так:

 md5(time . crc32(fingerprint) . protected URI)

Время и crc32 в littel endian.
Время 4 байта: time() - число секунд на 1.01.2010 от epoch


В URLе - /acbdefgd:acbdefg:abcdefg/file.zip

location ~ ^/(?<secure>[^/]+)(?<file>/.+)$ {
    secure_link          $secure;
    secure_link_base64   8;
    secure_link_expire   on;
    secure_link_fingerprint  "$http_user_agent$remote_addr$http_accept";
    alias        /path/to/$file;
}

В аргументах - /download/file.zip?secure=acbdefgd:acbdefg:abcdefg

location /download/ {
    secure_link          $arg_secure;
    secure_link_base64   8;
    secure_link_expire   on;
    secure_link_fingerprint  "$http_user_agent$remote_addr$http_accept";
    root    /path/to/files;
}

В куке - /download/file.zip, "Cookie: secure=acbdefgd:acbdefg:abcdefg"

location /download/ {
    secure_link          $cookie_secure;
    secure_link_base64   8;
    secure_link_expire   on;
    secure_link_fingerprint  "$http_user_agent$remote_addr$http_accept";
    root    /path/to/files;
}


-- 
Игорь Сысоев
http://sysoev.ru



Подробная информация о списке рассылки nginx-ru