Всех приветствую!
Помогите разобраться с модулем http_secure_link - на стороне Angie сервера я все настроил - подскажите как настроить на ответной стороне - если секурим, например, HLS ссылку - как выставить ее на сайте?
location ~* \/md5\/.*\.m3u8 {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr salt";
if ($secure_link = "") {
return 403;
}
set $location /md5/;
set $target_location /md5_insider;
set $secret salt;
set $debug false;
js_content md5.process;
}
location /md5_insider {
internal;
subrequest_output_buffer_size 10M;
rewrite /md5_insider/(.*) /dir-server/$1 break;
proxy_pass http://site;
}
location ~* \.ts {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr salt";
if ($secure_link = "") {
return 403;
}
add_header Content-Type video/mp2t;
proxy_hide_header Content-Type;
rewrite /md5/(.*) /dir-server/$1 break;
proxy_pass http://site;
}
Это часть конфига Angie
Еще есть скрипт который проверяет и генерит md5
var crypto = require('crypto')
function getHash(expires, path, ip, secret) {
var token = `${expires}${path}${ip} ${secret}`
var md5 = crypto.createHash('md5').update(token).digest("base64").replace(/=/g, '').replace(/\+/g, '-').replace(/\//g,'_')
return md5
}
function process(r) {
var location = r.variables.location || ''
var targetLocation = r.variables.target_location || '/'
var secret = r.variables.secret || ''
var debug = r.variables.debug || false
var originURI = r.uri.replace(location, '/')
var targetURI = `${targetLocation}${originURI}`
var pathURI = r.uri.replace(/(.*\/)[^\/]+$/,'$1')
var realIP = r.headersIn['x-real-ip'] || r.remoteAddress
// debug info
if (debug) {
r.error(`targetLocation: ${targetLocation}`)
r.error(`originURI: ${originURI}`)
r.error(`targetURI: ${targetURI}`)
r.error(`pathURI: ${pathURI}`)
r.error(`realIP: ${realIP}`)
r.error(JSON.stringify(r.variables.args))
r.error(JSON.stringify(r.args))
}
// Без expires или md5 отдаём 403 код
if (!r.args.expires || !r.args.md5) {
r.return(403)
} else {
// Делаем запрос контента
r.subrequest(targetURI, r.variables.args)
.then((res)=>{
// Обрабатываем только файлы m3u8
if(r.uri.match(/\.m3u8$/) && 200 <= res.status && res.status < 300){
// Разбираем файл и подставляем md5
var editedM3U8 = res.responseText.split("\n")
.map(line => {
if(line[0]==='#' || !/^(.*\.(?:ts|m3u8))$/.test(line)){
return line
}else{
var hash = getHash(r.args.expires, `${pathURI}${line}`, realIP, secret)
return `${line}?md5=${hash}&expires=${r.args.expires}`
}
})
.join("\n")
r.return(200, editedM3U8)
}else{
r.return(res.status, res.responseBody)
}
})
.catch((error) => {
r.error(error.message)
r.return(500)
})
}
return
}
export default {process};
Так вот он генерит ссылку по принципу
echo -n '1720572281/md5/index.m3u85.142.43.42 salt' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =