- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 购买指南
- 快速入门
- 管理员指南
- 视频会议用户指南
- 网络研讨会用户指南
- 智能会议室用户指南
-
开发与集成
- 开发指南
-
服务端API参考
- API概述
- 修订记录
- 登录鉴权
- 会议管理
-
会议控制
- 应用示例
-
接口参考
- 获取会控Token
- 查询会议实时信息
- 邀请与会者
- 挂断与会者
- 删除与会者
- 申请主持人
- 申请联席主持人
- 静音与会者
- 全场静音
- 举手
- 批量举手
- 锁定会议
- 延长会议
- 结束会议
- 设置多画面
- 设置自定义多画面
- 切换会议显示策略
- 主持人选看
- 启停会议录制
- 启停会议直播
- 重命名与会者
- 点名会场
- 广播会场
- 与会者自己解除静音
- 会场选看
- 锁定会场视频源
- 会议ID和密码邀请与会者
- 会中修改配置
- 获取WebSocket建链Token
- 邀请共享
- 主持人邀请与会者开启/关闭摄像头
- 取消广播
- 准入等候者
- 移入等候室
- 允许客户端录制
- 查询多画面布局
- 保存多画面布局
- 删除多画面布局
- 设置传译组
- 启动/停止同声传译
- 设置与会者语言频道
- 查询网络质量
- 查询会议录制文件信息
- 会议事件推送
- 仪表盘
- 网络研讨会管理
- 企业管理
- 企业部门管理
- 用户管理
- 企业管理员管理
- 硬终端管理
- 云会议室管理
- 用户密码管理
- 查询企业通讯录
- 企业资源管理
- 会议纪要
- 信息窗管理
- 用户头像管理
- 企业应用管理
- 错误码
- 附录
- FAQ
-
客户端SDK参考
- SDK概述
- Demo体验
- 一分钟跑通Demo
- SDK下载
- SDK维护周期
-
Android SDK
- 概述
- 快速入门
- 典型场景
- 接口参考
- 通知参考
- 错误码参考
-
版本更新内容
- 100.12.5更新内容
- 100.10.7更新内容
- 100.10.6更新内容
- 100.10.5更新内容
- 100.9.7更新内容
- 100.9.5更新内容
- 100.7.13更新内容
- 100.7.8更新内容
- 100.7.6更新内容
- 100.7.5更新内容
- 100.5.5更新内容
- 100.3.6更新内容
- 90.12.7更新内容
- 90.12.5更新内容
- 90.10.8更新内容
- 90.9.8更新内容
- 90.9.7更新内容
- 90.9.6更新内容
- 90.9.5更新内容
- 90.7.5更新内容
- 90.6.5更新内容
- 80.15.21更新内容
- 80.15.5更新内容
- 80.13.6更新内容
- 80.13.5更新内容
- 80.12.6更新内容
- 80.12.5更新内容
- 80.10.6更新内容
- 80.10.5更新内容
- 80.9.5更新内容
- 80.8.5更新内容
- 80.7.5更新内容
- 80.5.11更新内容
- 80.5.5更新内容
- 70.16.5更新内容
- 70.14.5更新内容
- 70.13.5更新内容
- 70.12.6更新内容
- 70.12.4更新内容
- 70.11.5更新内容
- 70.10.5更新内容
- 70.9.5更新内容
- 70.8.6更新内容
- 70.8.5更新内容
- 70.7.5更新内容
- 70.6.5更新内容
- 70.5.8更新内容
- 70.4.5更新内容
- 70.3.5更新内容
- 60.15.6更新内容
- 60.13.2更新内容
- 60.12.5更新内容
- 60.11.1更新内容
- 60.10.5更新内容
- 60.8.1更新内容
- 60.7.1更新内容
- SDK隐私声明
- SDK合规使用指南
- 修订记录
-
iOS SDK
- 概述
- 快速入门
- 典型场景
- 接口参考
- 通知参考
- 错误码参考
-
版本更新内容
- 100.12.6更新内容
- 100.12.5更新内容
- 100.10.7更新内容
- 100.10.6更新内容
- 100.10.5更新内容
- 100.9.7更新内容
- 100.9.5更新内容
- 100.7.13更新内容
- 100.7.8更新内容
- 100.7.6更新内容
- 100.7.5更新内容
- 100.5.5更新内容
- 100.3.6更新内容
- 90.12.7更新内容
- 90.12.5更新内容
- 90.10.8更新内容
- 90.9.6更新内容
- 90.9.5更新内容
- 90.7.5更新内容
- 90.6.5更新内容
- 80.15.21更新内容
- 80.15.6更新内容
- 80.15.5更新内容
- 80.13.8更新内容
- 80.13.6更新内容
- 80.13.5更新内容
- 80.12.6更新内容
- 80.12.5更新内容
- 80.10.5更新内容
- 80.9.5更新内容
- 80.8.5更新内容
- 80.7.5更新内容
- 80.5.11更新内容
- 80.5.5更新内容
- 70.16.5更新内容
- 70.14.5更新内容
- 70.13.5更新内容
- 70.12.6更新内容
- 70.12.4更新内容
- 70.11.5更新内容
- 70.10.5更新内容
- 70.9.5更新内容
- 70.8.6更新内容
- 70.8.5更新内容
- 70.7.5更新内容
- 70.6.5更新内容
- 70.5.8更新内容
- 70.4.5更新内容
- 70.3.5更新内容
- 60.15.5更新内容
- 60.13.2更新内容
- 60.12.5更新内容
- 60.11.6更新内容
- 60.10.5更新内容
- 60.8.1更新内容
- 60.7.1更新内容
- 90.10.8更新内容
- SDK隐私声明
- SDK合规使用指南
- 修订记录
-
Windows SDK
- 概述
- 快速入门
- 典型场景
- 接口参考
- 通知参考
- 错误码参考
-
版本更新内容
- 100.12.5更新内容
- 100.10.9更新内容
- 100.10.7更新内容
- 100.10.6更新内容
- 100.10.5更新内容
- 100.9.7更新内容
- 100.9.5更新内容
- 100.7.13更新内容
- 100.7.8更新内容
- 100.7.6更新内容
- 100.7.5更新内容
- 100.5.5更新内容
- 100.3.7更新内容
- 100.3.6更新内容
- 90.12.7更新内容
- 90.12.5更新内容
- 90.9.5更新内容
- 90.7.6更新内容
- 90.7.5更新内容
- 90.6.5更新内容
- 80.15.21更新内容
- 80.15.5更新内容
- 80.13.6更新内容
- 80.13.5更新内容
- 80.12.7更新内容
- 80.12.6更新内容
- 80.12.5更新内容
- 80.10.5更新内容
- 80.9.5更新内容
- 80.8.5更新内容
- 80.7.5更新内容
- 80.5.11更新内容
- 80.5.5更新内容
- 70.16.5更新内容
- 70.14.5更新内容
- 70.13.5更新内容
- 70.12.6更新内容
- 70.12.4更新内容
- 70.11.5更新内容
- 70.10.5更新内容
- 70.9.5更新内容
- 70.8.6更新内容
- 70.8.5更新内容
- 70.7.5更新内容
- 70.6.5更新内容
- 70.5.8更新内容
- 70.4.5更新内容
- 70.3.5更新内容
- 60.15.5更新内容
- 60.13.2更新内容
- 60.12.5更新内容
- 60.11.6更新内容
- 60.10.5更新内容
- 60.8.1更新内容
- SDK隐私声明
- SDK合规使用指南
- 修订记录
-
Mac SDK
- 概述
- 快速入门
- 典型场景
- 接口参考
- 通知参考
- 错误码参考
-
版本更新内容
- 100.12.5更新内容
- 100.10.7更新内容
- 100.10.6更新内容
- 100.10.5更新内容
- 100.9.7更新内容
- 100.9.5更新内容
- 100.7.13更新内容
- 100.7.8更新内容
- 100.7.6更新内容
- 100.7.5更新内容
- 100.5.5更新内容
- 100.3.6更新内容
- 90.12.7更新内容
- 90.12.5更新内容
- 90.9.5更新内容
- 90.7.5更新内容
- 90.6.5更新内容
- 80.15.21更新内容
- 80.15.5更新内容
- 80.13.6更新内容
- 80.13.5更新内容
- 80.12.7更新内容
- 80.12.6更新内容
- 80.12.5更新内容
- 80.10.5更新内容
- 80.9.5更新内容
- 80.8.5更新内容
- 80.7.5更新内容
- 80.5.11更新内容
- 80.5.5更新内容
- 70.16.5更新内容
- 70.14.5更新内容
- 70.13.5更新内容
- 70.12.6更新内容
- 70.12.4更新内容
- 70.11.5更新内容
- 70.10.5更新内容
- 70.9.5更新内容
- 70.8.6更新内容
- 70.8.5更新内容
- 70.7.5更新内容
- 70.6.5更新内容
- 70.5.8更新内容
- 70.4.5更新内容
- 70.3.5更新内容
- 60.15.5更新内容
- 60.13.2更新内容
- 60.12.5更新内容
- SDK隐私声明
- SDK合规使用指南
- 修订记录
-
Electron SDK
- 概述
- 快速入门
- 典型场景
- 接口参考
- 错误码
- 其他说明
-
版本更新内容
- 100.12.5更新内容
- 100.10.7更新内容
- 100.10.6更新内容
- 100.10.5更新内容
- 100.9.7更新内容
- 100.9.5更新内容
- 100.7.13更新内容
- 100.7.8更新内容
- 100.7.6更新内容
- 100.7.5更新内容
- 100.5.5更新内容
- 100.3.7更新内容
- 100.3.6更新内容
- 90.12.7更新内容
- 90.12.5更新内容
- 90.10.8更新内容
- 90.10.5更新内容
- 90.9.5更新内容
- 90.7.5更新内容
- 90.6.5更新内容
- 80.15.21更新内容
- 80.15.5更新内容
- 80.13.6更新内容
- 80.13.5更新内容
- 80.12.7更新内容
- 80.12.6更新内容
- 80.12.5更新内容
- 80.10.5更新内容
- 80.9.5更新内容
- 80.8.5更新内容
- 80.7.5更新内容
- 80.5.11更新内容
- 80.5.5更新内容
- 修订记录
- HarmonyOS SDK
- Web SDK
- SDK已知安全漏洞修复说明
-
常见问题
- 华为云会议资源类型
- 如何获取SDK的日志
- 移动端无法发起桌面共享
- Android SDK
- iOS SDK
- Windows SDK
-
Electron SDK
- 运行Electron demo时遇electron failed to install correctly的错误提示
- mac平台环境安装时遇permission denied的错误提示
- mac平台编译.node文件时遇no template named 'remove_cv_t'的错误提示
- windows平台编译.node文件时遇Could not find any Python installation to use的错误提示
- windows平台编译.node文件时遇Could not find any Visual Studio installation to use的错误提示
- mac平台集成ElectronSDK后,运行报错需要arm64架构的错误提示
- mac平台集成ElectronSDK后,本地编译启动后应用能正常入会,但是打包后应用出现入会闪退问题
- windows平台集成ElectronSDK后启动失败,报错HwmUisdk.node is not a valid Win32 application
- windows平台集成ElectronSDK后启动失败,报错The specified module could not be found
- Web SDK
- 专有名词解释
- 场景代码示例
- 终端Scheme应用集成
- 最佳实践
-
常见问题
-
产品规格
- 视频会议需要的带宽是多少?
- 华为云会议客户端支持哪些操作系统?
- 视频会议支持哪些华为硬终端?
- 是否支持非华为的硬终端对接?
- 华为云会议桌面端对PC有什么配置要求?
- 操作系统及浏览器有什么要求?
- 是否支持跨国视频会议?
- 云会议支持跨企业沟通吗?
- 云会议可以使用企业自身的通讯录吗?
- 云会议视频画面分辨率能够达到多少?
- 华为云会议桌面端会中画廊视图单屏最多显示多少个画面?
- 硬终端的推荐版本是多少?
- 华为云会议是否支持对接第三方会议终端管理平台?
- 华为云会议管理平台中能看到多长时间的历史会议记录?
- 可以将云会议室分配给哪些硬件设备?
- 云会议如何保证安全性?
- 云会议如何保证可靠性?
- 云桌面支持哪些华为云会议视频画面功能?
- 资源订购
- 账号密码
-
会议操作
- 华为云会议与华为云WeLink是互通的吗?
- 主持人密码和来宾密码有什么用处?
- 如何查看会议中的终端网络状况?
- 会控Web页面中信号(网络质量)分别代表什么?
- 会控中的锁定会议功能是什么?
- 匿名接入(免账号入会)是什么意思?
- 电话(手机/固话)入会是什么功能?
- 如何修改或取消预订会议?
- 多个人都用主持人密码入会时,谁是主持人?
- 跨企业如何开会?
- 接入号的使用场景是什么?
- 固定电话无法加入云会议,提示一段忙音,该如何解决?
- Web端会控界面无法显示未入会设备的在线/离线状态?
- 会议中进行网络切换是否会导致会议中断?
- 如何修改会议名称?
- 如何在会中邀请参会人?
- 为什么呼叫联系人参会,对方手机收不到?
- 如何修改华为云会议界面语言?
- 如何查询上一次会议的使用时长?
- 会议录制
-
客户端业务使用
- 客户端登录提示失败?
- 客户端日志如何获取?
- 手机使用“华为云会议”客户端入会一分钟消耗多少流量?
- 客户端如何切换摄像头?
- 安装Windows客户端,提示“The setup files are corrupted. Please obtain a new copy of the program”?
- 安装PC客户端,360弹出提示“有未知程序正准备运行,建议阻止”?
- Win10系统安装“华为云会议”,弹出提示“Windows Defender SmartScreen已阻止启动一个未识别的应用”?
- 客户端如何设置多画面?
- 使用华为云会议客户端开会时是否可以设置主持人轮询?
- 客户端会场在网络质量较差时出现画面卡顿,网络恢复后画面仍不恢复的情况,如何处理?
- 移动端在后台运行时能否被唤醒入会?
- PC客户端如何在会议中设置摄像头?
- 二次开发的免费试用账号如何申请?
- 网络连接失败时,怎么快速定位?
- 因显卡驱动兼容问题导致软终端崩溃怎么办?
- 哪些客户端支持虚拟背景?
- Windows哪些设备支持会中设置虚拟背景?
- 如何配置企业SSO登录?
- 如何打开视频画面智能排序?
- 如何开启或关闭会中镜像效果?
- 如何获得更好的声音体验
- Mac电脑出现无法安装华为云会议应用怎么办?
- PAD最多可显示多少视频画面
- 哪些设备支持共享手机声音?
- 启动PC客户端时,提示“您的操作系统版本过低,继续运行存在安全风险,建议先升级系统或更新系统安全补丁”?
- 升级PC客户端时,提示“检测到您下载的安装包异常,是否继续安装”?
- 等候室来宾有人数限制吗?是否占用会议并发资源?
- IdeaHub2.0 SmartRooms内置域名及IP地址说明
- 客户端对外连接访问说明
- Windows SmartRooms版本无法升级?
- 使用PC客户端开会时,视频模糊或声音卡顿?
- 哪些耳机支持屏蔽周围人声?
- 如何恢复与设置华为云会议Web端会中麦克风/摄像头/共享屏幕权限?
- Windows SmartRooms打开会议提示激活失败的原因
- 如何电话语音入会?
- 华为云会议桌面端如何使用和检测音频设备?
- 会中如何使用悬浮窗显示?
- 华为云会议移动端如何设置音视频?
- 如何更换头像?
- Windows 11系统安装华为云会议客户端后,启动时闪退?
-
硬终端配置故障
- TE硬终端配置完成后,无法入会。如何排除问题?
- 如何排除ACS状态异常问题?
- 如何排除SIP未激活问题?
- 如何排除SIP反复掉线问题?
- 会议设备“激活失败”,无法接入会议?
- ACS已连接,SIP提示:对不起,暂时无法提供服务?
- 硬终端日志、诊断信息如何获取?
- 为什么TE10/20找不到激活界面?
- TE10/20终端通过网线和PC电脑直连,升级终端版本失败?
- 使用UpgMaster工具升级硬终端版本,提示网络异常,如何处理?
- CloudLink Board 使用激活码激活后,在线路状态显示“ACS已连接,SIP未使用”?
- CloudLink Board 正常激活后,创建会议提示“呼集失败”?
- CloudLink Board 注册激活时选择华为云,显示界面提示“无法启用”?
- 如何重置硬件终端激活码?
- 硬终端业务故障
- 硬终端网络故障
-
硬终端业务使用
- 如何获取硬件终端SN码及激活码?
- TE硬终端初次使用如何配置?
- TE硬终端Web界面的初始密码是什么?
- 忘记了硬终端Web界面的密码怎么办?
- 如何恢复出厂设置?
- 绑定硬终端时提示SN已存在怎么处理?
- 硬终端如何与华为云账号解绑?
- 带宽不足,如何降低硬终端视频质量?
- 硬终端怎么自定义会场名?
- 硬终端上如何设置组合画面?
- TE30/40/50/60如何通过遥控器保存企业地址本到本地?
- 会议中呼叫成了语音会议,如何让会议保持视频会议?
- 如何进行资料共享?
- 手机如何通过AirPresence连接TE10、TE20、TE30/40/50/60终端,进行数据共享?
- 硬终端上的EUA投影码(6位数字投影码),怎么设置永久不变?
- 华为CloudLink Board是否支持安装第三方APP?
- 硬终端如何设置多画面?
- 如何连接和使用TE50设备?
- 使用TE20开会时,如何把会议视频存储起来?
- 使用TE30创建会议后,PC客户端或移动客户端能否主动加入该会议?
- 硬终端的SN号被绑定在一个企业后,无法绑定到另一个企业?
- 如何导入TE授权文件?
- 华为云管理平台已添加了TE40硬终端,之后如何将其关联到华为云?
- 如何将TE30-C的分辨率由720P升级到1080P?
- 硬件终端IP地址变化,重新上线需要手动拉会,而且注册时间较长如何解决?
- 硬件终端会议中,如果新增移动端会场入会,入会的该移动端出现声音异常怎么解决?
- 硬终端会场开会时为什么无法设置会议录播?
- 主会场硬终端掉线,硬终端会控Web界面无法添加会场怎么解决?
- CloudLink Board 是否支持无线辅流工具AirPresence发送辅流?
- CloudLink Board 是否支持与TE10/20、TEX0终端进行双向协作?
- CloudLink Board 是否支持读取U盘上的数据?
- TE30/40/50/60如何使用Wi-Fi激活?
- TE30发起会议,只有声音没有图像?
- 硬件接入账号是什么?
- TE10/TE20如何进行网络测试?
- 会议室设备接入账号资源说明
- 音视频设备故障
-
产品规格
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
App ID鉴权介绍
为了降低第三方应用集成华为云会议难度,并且提升开放接口的安全性,华为云会议开放能力中支持基于App ID的鉴权方式。App ID是一个应用的标识,同一个App ID可以同时在第三方的桌面终端、移动终端、Web应用上使用。
App ID鉴权原理
- 第三方客户端App ID鉴权原理
图1 第三方客户端App ID鉴权流程
鉴权前提:
- 开发者在华为云会议控制台上为自己的应用申请App ID,并获取App ID和App Key。
- 开发者在自己的服务端集成Signature生成算法,请参考“第三方服务集成Signature生成算法”。
- SDK初始化时传入App ID,请参考《客户端SDK参考》中的“初始化”部分。
鉴权过程:
- 第三方客户端将User ID(第三方User ID)发送给第三方服务器。
- 第三方服务器根据App ID、User ID、App Key等,生成鉴权用的签名材料Signature。
- 第三方服务端返回Signature,以及ExpireTime和Nonce值。
- 第三方客户端调用客户端SDK的Login接口,参数为User ID、Signature、ExpireTime和Nonce。
- 客户端SDK向华为云会议服务端发起鉴权。
- 鉴权通过后SDK获取接入Token。该Token对第三方客户端不可见,由SDK负责维护和刷新。
- 第三方服务App ID鉴权原理
图2 第三方服务端App ID鉴权流程
鉴权前提:
- 开发者在华为云会议控制台上为自己的应用申请App ID,并获取App ID和App Key。
- 开发者在自己的服务端集成Signature生成算法,请参考“第三方服务集成Signature生成算法”。
鉴权过程:
- 第三方服务端根据调用的业务接口所需的User ID(第三方User ID),加上App ID、App Key、ExpireTime和Nonce,生成鉴权用的签名材料Signature。
- 第三方服务端调用华为云会议服务端的App ID鉴权接口(REST接口)。
- 华为云会议服务端鉴权通过后,返回接入Token。
- 第三方服务端使用接入Token调用其他业务接口。

1. 接入Token有效期是12~24小时。
2. 生成Signature和调用appAuth接口时可以不带User ID,如果不带User ID默认是创建企业时的创建者(企业Owner)。
3. User ID需要第三方应用保证在同一个企业内是唯一的。如果第三方开发者是SP,同一个应用在多个企业使用,接口中除了带User ID外,还需要带Corp ID(企业ID)。
4. 如果需要使用华为云会议通讯录的情况下,在登录鉴权过程中还可以携带邮箱、姓名、电话号码等信息,这些信息将被写入华为云会议的通讯录中。
App ID的申请
- 使用华为云账号,登录华为云会议控制台。前提是该华为云账号已经购买了华为云会议服务或者已经绑定了华为云会议企业管理员账号,请参考“开发流程”章节中的“开发前准备”。
- 单击“应用管理”,再单击“申请应用”。在弹出的创建应用的输入框中输入第三方应用的名称及描述。
图3 申请应用
- 请填写真实的联系人姓名和手机号码。
- 申请提交后,华为云会议工作人员会在1~3个工作日内完成审核和审批。
- 生成App Key
审批通过后,单击“生成AppKey”再单击“确认”生成App Key。
图4 生成App Key

- App Key是生成鉴权签名材料Signature的密钥,需要在第三方服务端妥善保存,不要泄露出去,否则会出现被盗用会议资源的风险。
- App Key只能保存在第三方服务端,不能保存在第三方终端中,否则很容易被反编译获取。
- App Key需要妥善保存,遗失后只能重置,不能找回。重新生成App Key原来的App Key将会在一个月后失效。
第三方服务集成Signature生成算法
App只在单个企业内使用的情况下,生成鉴权签名材料Signature的算法如下:
Signature = HexEncode(HMAC-SHA256((App ID + ":" + User ID + ":" + ExpireTime + ":" + Nonce), appKey))
App是SP开发的,需要在多个企业内使用的情况下,生成鉴权签名材料Signature的算法如下:
- 作为企业普通用户,对自己的会议管理:
Signature = HexEncode(HMAC-SHA256((App ID + ":" + CorpID + ":" + User ID + ":" + ExpireTime + ":" + Nonce), appKey))
- 作为企业管理员,对企业资源进行管理:
Signature = HexEncode(HMAC-SHA256((App ID + ":" + CorpID + "::" + ExpireTime + ":" + Nonce), appKey))
作为企业管理员时也可以带User ID,这个User ID必须具有管理员权限。
- 作为SP管理员,对SP资源进行管理(如创建企业或者分配企业资源等):
Signature = HexEncode(HMAC-SHA256((App ID + ":::" + ExpireTime + ":" + Nonce), appKey))
算法说明:
- HMAC-SHA256的输入数据是App ID、CorpID(可选)、User ID(可选)、ExpireTime、Nonce值,中间用“:”分隔。如d5e17******************489e:alice@ent01:1604020600:EycLQs************************nINuU1EBpQ
SP模式下即使User ID或者Corp ID和User ID不填的情况下,对应的“:”不能省略。
- HMAC-SHA256的密钥是App Key。如tZAe********q32T
- HMAC-SHA256生成的二进制数需要转换为十六进制字符串(HexEncode),上述的数据和密钥最终生成的Signature如下:2a8c780c***************************************************5a6c44f3c1b3c2455d
- ExpireTime:鉴权签名材料Signature的过期时间戳。单位是秒。比如当前的系统的时间戳是1604020000,Signature有效期设置成10分钟,则ExpireTime = 1604020000+10*60 = 1604020600
- Nonce:随机字符串,每次计算鉴权签名材料Signature时都必须不同。字符串长度为32~64字节

1. 由于鉴权签名材料Signature是有有效期的,所以第三方服务端的系统时间和华为云会议服务端的系统时间误差不能太大(小于ExpireTime中的有效期,如上例中的10分钟)。华为云会议服务端时间已经跟标准NTP时间同步。
2. ExpireTime为0,表示永远不过期。为了防止重放攻击,不建议将ExpireTime设置为0。
Java版本的Signature生成算法源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class HmacSHA256 { //十六进制字符集 private final static char[] DIGEST_ARRAYS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /** * 功能:Signature生成算法 * 输入参数: * 1.data: HMAC-SHA256的输入数据 * 2.key: App Key * 输出参数:十六进制字符串编码的HMAC-SHA256值 */ public static String encode(String data, String key) { byte[] hashByte; try { Mac sha256HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256HMAC.init(secretKey); hashByte = sha256HMAC.doFinal(data.getBytes("UTF-8")); } catch (NoSuchAlgorithmException | UnsupportedEncodingException | InvalidKeyException e) { return null; } return bytesToHex(hashByte); } /** * 功能:byte类型数组转换成十六进制字符串 * 输入参数: * 1.bytes:被转换的字节数组 * 输出参数:十六进制字符串 */ private static String bytesToHex(byte[] bytes) { StringBuffer hexStr = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { hexStr.append(DIGEST_ARRAYS[bytes[i] >>> 4 & 0X0F]); hexStr.append(DIGEST_ARRAYS[bytes[i] & 0X0F]); } return hexStr.toString(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import hmac from hashlib import sha256 class HmacSHA256: def __init__(self, sig_data, sig_key): self.data = sig_data self.key = sig_key def encode(self): try: sig_data = self.data.encode('utf-8') secret_key = self.key.encode('utf-8') signature = hmac.new(secret_key, sig_data, digestmod=sha256).hexdigest() except Exception as e: print (e) raise e return signature |
C++版本的Signature生成算法源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#include <openssl/hmac.h> #include <string.h> #include <iostream> using namespace std; const int HMAC_ENCODE_SUCCESS = 0; const int HMAC_ENCODE_FAIL = -1; const int HMAC_SHA256_STR_LEN = 65; /** * 功能: 字节流转换成十六进制字符串 * 输入参数: * 1.input: 字节流指针 * 2.len: 字节流字节数 * 输出参数: * 3.output: 输出缓冲区 * 6.output_length: Signature字符串长度 * 返回值: * 0:失败 * 大于0的整数:转换后的字符串长度 */ int Byte2HexStr(char * output, unsigned char * input, unsigned int len) { if ((NULL == output) || (NULL == input)) { return 0; } unsigned int i = 0; for (i = 0; i < len; i++) { sprintf_s(output + 2*i, HMAC_SHA256_STR_LEN-2*i, "%x%x", (input[i] >> 4) & 0x0F, input[i]&0x0F); } *(output + 2*i) = '\0'; return 2*i; } /** * 功能: Signature生成算法 * 输入参数: * 1.key: App Key * 2.key_length: App Key的字符串长度 * 3.input: HMAC-SHA256的输入数据 * 4.input_length: HMAC-SHA256的输入数据的字符串长度 * 输出参数: * 5.output: Signature输出缓冲区 * 6.output_length: Signature字符串长度 * 返回值: * 0:成功 * -1:失败 */ int HmacEncode(const char * key, unsigned int key_length, const char * input, unsigned int input_length, char output[HMAC_SHA256_STR_LEN], unsigned int &output_length) { //计算HMAC_SHA256的字节流 const EVP_MD * engine = EVP_sha256(); unsigned char * byte_output = (unsigned char*)malloc(EVP_MAX_MD_SIZE); if (NULL == byte_output) { output_length = 0; return HMAC_ENCODE_FAIL; } unsigned int byte_output_length = 0; HMAC_CTX *ctx; ctx = HMAC_CTX_new(); HMAC_Init(ctx, key, strlen(key), engine); HMAC_Update(ctx, (unsigned char*)input, strlen(input)); HMAC_Final(ctx, byte_output, &byte_output_length); HMAC_CTX_free(ctx); //HMAC_SHA256的字节流转换成十六进制字符串 int ret = Byte2HexStr(output, byte_output, byte_output_length); free(byte_output); if (0 == ret) { output_length = 0; return HMAC_ENCODE_FAIL; } else { output_length = ret; return HMAC_ENCODE_SUCCESS; } } |
JavaScript版本的Signature生成算法源代码
1 2 3 4 5 6 7 8 9 10 11 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"> </script> <script> /** * 1、重要提醒:生成Signature的算法不要放在前端代码中,否则会导致App Key泄露,从而导致企业资源被盗 * 2、本示例代码仅供调试时使用 */ function genSignature(data,appKey){ var sign = CryptoJS.HmacSHA256(data,appKey).toString(); return sign } </script> |
集成UI SDK的第三方客户端App ID鉴权
第三方客户端初始化SDK时,需要传入事先申请好的App ID。
- Android SDK的初始化接口,请参考《客户端SDK参考》中“Android SDK”的“初始化”章节。
- iOS SDK的初始化接口,请参考《客户端SDK参考》中“iOS SDK”的“初始化”章节。
- Windows SDK的初始化接口,请参考《客户端SDK参考》中“Windows SDK”的“初始化”章节。
- Mac SDK的初始化接口,请参考《客户端SDK参考》中“Mac SDK”的“初始化”章节。
第三方客户端登录时,从第三方服务端获取Signature、ExpireTime和Nonce后,调用终端SDK的Login接口完成鉴权。
第三方服务端App ID鉴权
第三方服务端通过App ID鉴权接口,完成App ID鉴权,并获取接入Token。请参考《服务端API参考》中的“执行App ID鉴权”章节。