ONVIF Server 鉴权实现代码(服务端)
ONVIF鉴权实现代码
生成gSOAP框架代码,这个网上有很多教程,需要加入很多文件,并且需要openssl库。加入需要鉴权的文件和openssl库以后,只需要加每个接口中加入鉴权操作的代码,调用的时候就能实现鉴权。
ONVIF的鉴权分两种: HTTP Digest 和 WS-Username Token
在ONVIF Device Test Tool上可以对两种鉴权分别进行测试。
authenticate.h
#ifndef __AUTHENTICATE_H__
#define __AUTHENTICATE_H__
#include <stdio.h>
#include "stdsoap2.h"
#define AUTHREALM "IPC_CAM"
#define ACCESS_CONTROL \
do \
{ \
if (onvif_access_control(soap) != SOAP_OK && http_digest_auth(soap) != SOAP_OK) \
return 401; \
} while (0);
/* HTTP Digest Authentication */
int http_digest_auth(struct soap *soap);
/* WS-Username Token */
int onvif_access_control(struct soap *soap);
#endif /* __AUTHENTICATE_H__ */
authenticate.c
int onvif_access_control(struct soap *soap)
{
const char *username = soap_wsse_get_Username(soap);
if (username == NULL)
{
printf("username is null\r\n");
}
node_t *user_node = search_node(g_onvif_cfg.users, compare_user, (char *)username);
if (!user_node)
{
LOG_INFO("ERROR Username is null\r\n");
return 401;
}
const char *password = ((User *)(user_node->data))->password;
if (soap_wsse_verify_Password(soap, password))
{
soap_wsse_delete_Security(soap);
LOG_INFO("ERROR Password is fault\r\n");
return 401;
}
soap_wsse_delete_Security(soap);
return SOAP_OK;
}
int http_digest_auth(struct soap *soap)
{
if (soap->authrealm && soap->userid)
{
node_t *user_node = search_node(g_onvif_cfg.users, compare_user, (char *)soap->userid);
if (user_node)
{
char *passwd = ((User *)(user_node->data))->password;
if (!strcmp(soap->authrealm, AUTHREALM))
{
if (!http_da_verify_post(soap, passwd))
{
LOG_INFO("verify ok\r\n");
return SOAP_OK;
}
}
}
}
soap->authrealm = AUTHREALM;
return 401;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!