nginx rtmp module新增鑑權機制

2021-08-07 18:07:54 字數 3285 閱讀 3945

目前直播平台非常的火爆。當前有不少的流**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...