目前直播平台非常的火爆。當前有不少的流**cdn,基於rtmp,http-flv和hls協議的。
也可以自己搭建私有的流**伺服器,目前比較常見的有:live555,easydarwin,red5,dss,wowza,nginx-rtmp
這裡重點講解開源的nginx-rtmp伺服器。但是流**伺服器最大的乙個問題就是防盜煉和鑑權問題,如何防止流**伺服器被第三方應用免費使用。
所以需要給nginx-rtmp新增鑑權機制,大致的方案如下:
啟動乙個鑑權服務。提供 get_user_token 和 auth 兩個api。
給每個主播或者**直播的人員分配user id 和 token,當填寫推流和拉流url需要填寫鑑權引數,比如:
格式:推流名稱?使用者id&使用者token
在nginx-rtmp-module中的ngx_rtmp_cmd_module.c新增鑑權方法:
int auth(const char *auth_info)
ngx_log_stderr(0, "connect to auth svr success!\n");
char *pos = null;
pos = strchr(auth_info, '&');
if(pos == null)
char user_id[100] = ;
char token[100] = ;
strncpy(user_id, auth_info, (unsigned int)(pos-auth_info));
strncpy(token, pos+1, (unsigned int)(auth_info+strlen(auth_info)-pos-1));
char req[1024] = ;
snprintf(req, 1024, ", \"body\":}\n",
(unsigned long long)time(null), user_id, token);
ret = send(fd, req, strlen(req), 0);
if(ret > 0)
else
char rsp[1024] = ;
ret = recv(fd, rsp, 1023, 0);
if(ret > 0 )
char err = *(pos+5);
if(err == '0')
else
} else if(ret == 0)
else
close(fd);
return ret;
}
將鑑權方法在nginx-rtmp-module中的ngx_rtmp_cmd_module.c的推流初始化方法(如下)
static ngx_int_t ngx_rtmp_cmd_publish_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in)
呼叫鑑權方法,具體**如下:
static ngx_int_t
ngx_rtmp_cmd_publish_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
ngx_chain_t *in)
, ,,,
};ngx_memzero(&v, sizeof(v));
if (ngx_rtmp_receive_amf(s, in, in_elts,
sizeof(in_elts) / sizeof(in_elts[0])))
ngx_rtmp_cmd_fill_args(v.name, v.args);
ngx_log_error(ngx_log_info, s->connection->log, 0,
"publish: name='%s' args='%s' type=%s silent=%d",
v.name, v.args, v.type, v.silent);
//新增呼叫鑑權函式
int ret = auth((const char*)v.args);
if (ret != 0)
return ngx_rtmp_publish(s, &v);
}
static ngx_int_t
ngx_rtmp_cmd_play_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
ngx_chain_t *in)
, ,,,
,};ngx_memzero(&v, sizeof(v));
if (ngx_rtmp_receive_amf(s, in, in_elts,
sizeof(in_elts) / sizeof(in_elts[0])))
ngx_rtmp_cmd_fill_args(v.name, v.args);
ngx_log_error(ngx_log_info, s->connection->log, 0,
"play: name='%s' args='%s' start=%i duration=%i "
"reset=%i silent=%i",
v.name, v.args, (ngx_int_t) v.start,
(ngx_int_t) v.duration, (ngx_int_t) v.reset,
(ngx_int_t) v.silent);
//呼叫鑑權操作
int ret = auth((const char*)v.args);
if (ret != 0)
return ngx_rtmp_play(s, &v);
}
重新編譯nginx源**
#./configure --prefix=/home/xucuiping/tool/src/nginx_self/sdk --add-module=/home/xucuiping/tool/src/nginx_self/src/nginx-rtmp-module-master --with-debug
#make
#make install
啟動nginx
#./nginx -c /home/xucuiping/tool/src/nginx_self/sdk/conf/nginx_rtmp.conf
測試:
在此表示感謝!
mongdb 鑑權失敗,新增資料失敗
報錯資訊 use admin switched to db admin db.createuser 2016 04 19t18 31 42.712 0800 e query thread1 error couldn t add user not authorized on admin to exec...
基於cookie的簡單鑑權與JWT鑑權
cookie鑑權在本文沒有做token的加密,通過token 使用者資訊json鍵值對的方式存入redis,這樣避免了session共享的問題,由於本文實現上省略了token加密,不能從cookie裡解密拿到使用者資訊,再加上cookie有被偽造的風險,所以安全性較低.有token加密的實現在本文j...
Asterisk鑑權演算法
客戶端傳送的鑑權資訊如下 digest username 103 realm asterisk nonce 51d89e6e uri sip 102 192.168.50.26 algorithm md5,response e9754418dd7dbea9ba740001f8d62598 aster...