鉴权失败添加错误描述信息

This commit is contained in:
xiongziliang 2018-02-05 17:25:22 +08:00
parent 805a1a945e
commit cf8b6f6b91
5 changed files with 36 additions and 31 deletions

View File

@ -86,7 +86,7 @@ extern const char kBroadcastOnRtspAuth[];
//鉴权结果回调对象 //鉴权结果回调对象
typedef std::function<void(bool success)> AuthInvoker; typedef std::function<void(bool success, const string &errMessage)> AuthInvoker;
//收到rtmp推流事件广播通过该事件控制推流鉴权 //收到rtmp推流事件广播通过该事件控制推流鉴权
extern const char kBroadcastRtmpPublish[]; extern const char kBroadcastRtmpPublish[];

View File

@ -202,10 +202,9 @@ inline bool HttpSession::checkLiveFlvStream(){
return true; return true;
} }
auto onRes = [this,mediaSrc](bool authSuccess){ auto onRes = [this,mediaSrc](bool authSuccess,const string &err){
if(!authSuccess){ if(!authSuccess){
string status = "401 Unauthorized"; sendResponse("401 Unauthorized", makeHttpHeader(true,err.size()),err);
sendResponse(status.data(), makeHttpHeader(true,status.size()),status);
shutdown(); shutdown();
return ; return ;
} }
@ -276,23 +275,23 @@ inline bool HttpSession::checkLiveFlvStream(){
}; };
weak_ptr<HttpSession> weakSelf = dynamic_pointer_cast<HttpSession>(shared_from_this()); weak_ptr<HttpSession> weakSelf = dynamic_pointer_cast<HttpSession>(shared_from_this());
Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess){ Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess,const string &err){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
strongSelf->async([weakSelf,onRes,authSuccess](){ strongSelf->async([weakSelf,onRes,authSuccess,err](){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
onRes(authSuccess); onRes(authSuccess,err);
}); });
}; };
auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,info,invoker); auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,info,invoker);
if(!flag){ if(!flag){
//该事件无人监听,默认不鉴权 //该事件无人监听,默认不鉴权
onRes(true); onRes(true,"");
} }
return true; return true;
} }

View File

@ -130,7 +130,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
dec.load<AMFValue>();/* NULL */ dec.load<AMFValue>();/* NULL */
m_mediaInfo.parse(m_strTcUrl + "/" + dec.load<std::string>()); m_mediaInfo.parse(m_strTcUrl + "/" + dec.load<std::string>());
auto onRes = [this](bool authSuccess){ auto onRes = [this](bool authSuccess,const string &err){
auto src = dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA, auto src = dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA,
m_mediaInfo.m_vhost, m_mediaInfo.m_vhost,
m_mediaInfo.m_app, m_mediaInfo.m_app,
@ -140,12 +140,12 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
AMFValue status(AMF_OBJECT); AMFValue status(AMF_OBJECT);
status.set("level", ok ? "status" : "error"); status.set("level", ok ? "status" : "error");
status.set("code", ok ? "NetStream.Publish.Start" : (authSuccess ? "NetStream.Publish.BadName" : "NetStream.Publish.BadAuth")); status.set("code", ok ? "NetStream.Publish.Start" : (authSuccess ? "NetStream.Publish.BadName" : "NetStream.Publish.BadAuth"));
status.set("description", ok ? "Started publishing stream." : (authSuccess ? "Already publishing." : "Auth failed")); status.set("description", ok ? "Started publishing stream." : (authSuccess ? "Already publishing." : err.data()));
status.set("clientid", "0"); status.set("clientid", "0");
sendReply("onStatus", nullptr, status); sendReply("onStatus", nullptr, status);
if (!ok) { if (!ok) {
WarnL << "onPublish:" WarnL << "onPublish:"
<< (authSuccess ? "Already publishing:" : "Auth failed:") << (authSuccess ? "Already publishing:" : err.data())
<< m_mediaInfo.m_vhost << " " << m_mediaInfo.m_vhost << " "
<< m_mediaInfo.m_app << " " << m_mediaInfo.m_app << " "
<< m_mediaInfo.m_streamid << endl; << m_mediaInfo.m_streamid << endl;
@ -157,17 +157,17 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
}; };
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this()); weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool success){ Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool success,const string &err){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
strongSelf->async([weakSelf,onRes,success](){ strongSelf->async([weakSelf,onRes,success,err](){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
onRes(success); onRes(success,err);
}); });
}; };
auto flag = NoticeCenter::Instance().emitEvent(Config::Broadcast::kBroadcastRtmpPublish, auto flag = NoticeCenter::Instance().emitEvent(Config::Broadcast::kBroadcastRtmpPublish,
@ -175,7 +175,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
invoker); invoker);
if(!flag){ if(!flag){
//该事件无人监听,默认鉴权成功 //该事件无人监听,默认鉴权成功
onRes(true); onRes(true,"");
} }
} }
@ -189,7 +189,7 @@ void RtmpSession::onCmd_deleteStream(AMFDecoder &dec) {
} }
void RtmpSession::doPlay(AMFDecoder &dec){ void RtmpSession::doPlay(AMFDecoder &dec){
auto onRes = [this](bool authSuccess) { auto onRes = [this](bool authSuccess,const string &err) {
auto src = dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA, auto src = dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA,
m_mediaInfo.m_vhost, m_mediaInfo.m_vhost,
m_mediaInfo.m_app, m_mediaInfo.m_app,
@ -207,13 +207,13 @@ void RtmpSession::doPlay(AMFDecoder &dec){
AMFValue status(AMF_OBJECT); AMFValue status(AMF_OBJECT);
status.set("level", ok ? "status" : "error"); status.set("level", ok ? "status" : "error");
status.set("code", ok ? "NetStream.Play.Reset" : (authSuccess ? "NetStream.Play.StreamNotFound" : "NetStream.Play.BadAuth")); status.set("code", ok ? "NetStream.Play.Reset" : (authSuccess ? "NetStream.Play.StreamNotFound" : "NetStream.Play.BadAuth"));
status.set("description", ok ? "Resetting and playing." : (authSuccess ? "No such stream." : "Auth failed")); status.set("description", ok ? "Resetting and playing." : (authSuccess ? "No such stream." : err.data()));
status.set("details", m_mediaInfo.m_streamid); status.set("details", m_mediaInfo.m_streamid);
status.set("clientid", "0"); status.set("clientid", "0");
sendReply("onStatus", nullptr, status); sendReply("onStatus", nullptr, status);
if (!ok) { if (!ok) {
WarnL << "onPlayed:" WarnL << "onPlayed:"
<< (authSuccess ? "No such stream:" : "Auth failed:") << (authSuccess ? "No such stream:" : err.data())
<< m_mediaInfo.m_vhost << " " << m_mediaInfo.m_vhost << " "
<< m_mediaInfo.m_app << " " << m_mediaInfo.m_app << " "
<< m_mediaInfo.m_streamid << m_mediaInfo.m_streamid
@ -292,23 +292,23 @@ void RtmpSession::doPlay(AMFDecoder &dec){
}; };
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this()); weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess){ Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess,const string &err){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
strongSelf->async([weakSelf,onRes,authSuccess](){ strongSelf->async([weakSelf,onRes,authSuccess,err](){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
onRes(authSuccess); onRes(authSuccess,err);
}); });
}; };
auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,m_mediaInfo,invoker); auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,m_mediaInfo,invoker);
if(!flag){ if(!flag){
//该事件无人监听,默认不鉴权 //该事件无人监听,默认不鉴权
onRes(true); onRes(true,"");
} }
} }
void RtmpSession::onCmd_play2(AMFDecoder &dec) { void RtmpSession::onCmd_play2(AMFDecoder &dec) {

View File

@ -641,7 +641,7 @@ bool RtspSession::handleReq_Play() {
send_SessionNotFound(); send_SessionNotFound();
return false; return false;
} }
auto onRes = [this](bool authSuccess){ auto onRes = [this](bool authSuccess,const string &err){
char response[2 * 1024]; char response[2 * 1024];
m_pcBuf = response; m_pcBuf = response;
if(!authSuccess && m_bFirstPlay){ if(!authSuccess && m_bFirstPlay){
@ -650,8 +650,12 @@ bool RtspSession::handleReq_Play() {
"RTSP/1.0 401 Unauthorized\r\n" "RTSP/1.0 401 Unauthorized\r\n"
"CSeq: %d\r\n" "CSeq: %d\r\n"
"Server: %s-%0.2f(build in %s)\r\n" "Server: %s-%0.2f(build in %s)\r\n"
"%s\r\n", "%s"
m_iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, dateHeader().data()); "Content-Type: text/plain\r\n"
"Content-Length: %d\r\n\r\n%s",
m_iCseq, SERVER_NAME,
RTSP_VERSION, RTSP_BUILDTIME,
dateHeader().data(),(int)err.size(),err.data());
send(m_pcBuf,n); send(m_pcBuf,n);
shutdown(); shutdown();
return; return;
@ -730,23 +734,23 @@ bool RtspSession::handleReq_Play() {
}; };
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this()); weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess){ Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess,const string &err){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
strongSelf->async([weakSelf,onRes,authSuccess](){ strongSelf->async([weakSelf,onRes,authSuccess,err](){
auto strongSelf = weakSelf.lock(); auto strongSelf = weakSelf.lock();
if(!strongSelf){ if(!strongSelf){
return; return;
} }
onRes(authSuccess); onRes(authSuccess,err);
}); });
}; };
auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,m_mediaInfo,invoker); auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,m_mediaInfo,invoker);
if(!flag){ if(!flag){
//该事件无人监听,默认不鉴权 //该事件无人监听,默认不鉴权
onRes(true); onRes(true,"");
} }
return true; return true;
} }

View File

@ -112,14 +112,16 @@ static onceToken s_token([](){
NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastRtmpPublish,[](BroadcastRtmpPublishArgs){ NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastRtmpPublish,[](BroadcastRtmpPublishArgs){
InfoL << args.m_vhost << " " << args.m_app << " " << args.m_streamid << " " << args.m_param_strs ; InfoL << args.m_vhost << " " << args.m_app << " " << args.m_streamid << " " << args.m_param_strs ;
EventPoller::Instance().async([invoker](){ EventPoller::Instance().async([invoker](){
invoker(true); //invoker(true,"");//鉴权成功
invoker(false,"this is auth failed message");//鉴权失败
}); });
}); });
NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastMediaPlayed,[](BroadcastMediaPlayedArgs){ NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastMediaPlayed,[](BroadcastMediaPlayedArgs){
InfoL << args.m_schema << " " << args.m_vhost << " " << args.m_app << " " << args.m_streamid << " " << args.m_param_strs ; InfoL << args.m_schema << " " << args.m_vhost << " " << args.m_app << " " << args.m_streamid << " " << args.m_param_strs ;
EventPoller::Instance().async([invoker](){ EventPoller::Instance().async([invoker](){
invoker(true); //invoker(true,"");//鉴权成功
invoker(false,"this is auth failed message");//鉴权失败
}); });
}); });