はじめに
コンテンツへのTimer付のアクセス制限を行いたいので設定を行ったので忘備録。Authクエリ作成はPHPで作成実施。
2通りの方法があります:
-NGINXのsecure_linkディレクティブを利用する
-CDN360独自?のeval_funcディレクティブを利用する
この機能を使うと指定ディレクトリへの直接アクセスはアク禁になり、認証クエリの付与がないとアクセスできなくなります。また認証クエリは有効期限設定ができるのでタイマー的な制限が可能です。
NGINXのsecure_linkディレクティブを利用する場合
http://nginx.org/en/docs/http/ngx_http_secure_link_module.html
に沿った設定になります。
ポイントとして認証クエリはBase64+MD5になります。
クエリ要素としては、キーフレーズ+URL+有効期限の三要素を一旦md5化して認証クエリとして付与します。
合わせて有効期限は個別に再度付与します。
実際のURIクエリ構造としては
ドメイン+URI+認証クエリ名md5+有効期限クエリ名expiresになります。
例http://www.foo.com/promo/cdnetworks_intro.mp4?md5=fJO_5y3x2BIfcl2po8gJmg&expires=1601867656
クエリ無し、クエリ間違えの場合は403レスポンス
クエリ有効期限切れは410レスポンスの設定
サンプルではキーフレーズをcdnetworksにします。
CDN360サンプルコード
location /promo/ {
origin_pass www_fooorigin_com;
secure_link $arg_md5,$arg_expires;
secure_link_md5 "cdnetworks$uri$secure_link_expires";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
上記設定に対するAUTHクエリ作成サンプルPHP。
有効期限は20秒にしています。
<?php
header ('Content-type: text/html; charset=utf-8') ;
$uri = "/promo/cdnetworks_intro.mp4" ;
$password = "cdnetworks" ;
if( iconv( "UTF-8" , "UTF-8" , $uri ) != $uri ) {
$uri = iconv( "EUC-JP" , "UTF-8" , $uri );
}
$url = "http://cdn360.foo.com".$uri ;
$arrPath = split( "/" , $uri );
for( $i = 0 ; $i < sizeof( $arrPath ) ; $i++ ){
if( $i != 0 )
$enc_uri = $enc_uri."/";
$enc_uri = $enc_uri.urlencode($arrPath[ $i ]);
}
$current_time = time();
$expiration = time() + 20 ;
$md5 = base64_encode(md5($password.$enc_uri.$expiration, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = $url."?"."md5=".$md5."&expires=".$expiration ;
echo $url ;
?>
CDN360独自?のeval_funcディレクティブを利用する
旧来CDNetworks CDNでも当該機能がありましたがMD5のみでの組込みでした。secure_linkだとアプリ側の組み込み更改が発生してしまうので同様にmd5化だけでも機能実現が出来るeval_funcというディレクティブがあります。
https://docs.cdnetworks.com/cdn/docs/edge-logic/supported-directives#eval_func
サンプルCDN360コード
location /promo/ {
origin_pass www_fooorigin_com;
eval_func $result MD5 "cdnetworks$uri$arg_expires";
eval_func $result HEX_ENCODE $result;
if ($result != $arg_md5) {
return 403;
}
eval_func $result COMPARE_INT $arg_expires $sec;
if ($result != "1") {
return 410;
}
}
この場合のAUTHクエリ作成PHPは
<?php
header ('Content-type: text/html; charset=utf-8') ;
$uri = "/promo/cdnetworks_intro.mp4" ;
$password = "cdnetworks" ;
if( iconv( "UTF-8" , "UTF-8" , $uri ) != $uri ) {
$uri = iconv( "EUC-JP" , "UTF-8" , $uri );
}
$url = "http://cdn360.foo.com".$uri ;
$arrPath = split( "/" , $uri );
for( $i = 0 ; $i < sizeof( $arrPath ) ; $i++ ){
if( $i != 0 )
$enc_uri = $enc_uri."/";
$enc_uri = $enc_uri.urlencode($arrPath[ $i ]);
}
$current_time = time();
$expiration = time() + 20 ;
$input = $password.$enc_uri.$expiration ;
$hmac = md5($input) ;
$url = $url."?"."md5=".$hmac."&expires=".$expiration ;
echo $url ;
?>