[声网音频SDK实战教程] 对于声网 "连麦鉴权" 功能的实战教程

简介

通过本篇教程, 您将学习到如何具体实施声网 "连麦鉴权” 功能.
连麦鉴权,主要用于控制频道内的用户是否有发布流的权限,需要开发者通过自己的业务服务端部署并生成 Token、声网服务器再对生成的 Token 校验实现。
该功能可以确保频道内的发流用户都经过授权,从而防止黑客通过利用业务漏洞或盗取 Token 进行直播间炸房等行为。


如果还不了解什么是 "连麦鉴权”, 请先看这个声网教程

https://docs.agora.io/cn/live-streaming-premium-legacy/faq/token_cohost?platform=Android


具体的实施方案

1] 首先定义拉取最新声网 Token & ClientRole 的接口
request 参数 : 
room_id : 房间ID
user_id : 用户ID


respond 参数

/**
 * 声网SDK : token
 * <p>
 * 传入用于鉴权的 Token,可设为如下一个值:
 * <p>
 * 1] 临时 Token。你可以在控制台里生成一个临时 Token,详见获取临时 Token。
 * 加入频道时,请确保填入的频道名和生成临时 Token 时填入的频道名一致。
 * 2] 在你的服务器端生成的 Token。在安全要求高的场景下,我们推荐你使用此种方式生成的 Token,
 * 详见从服务端生成 Token。加入频道时,请确保填入的频道名和 uid 与生成 Token 时填入的频道名和 uid 一致。
 */
@SerializedName("token")
private String agoraToken;

/**
 * 直播场景里的用户角色:
 * CLIENT_ROLE_BROADCASTER(1):主播可以发流也可以收流。如果你在频道中设置该角色,SDK 会自动调用 muteLocalAudioStream(false) 和 muteLocalVideoStream(false)。
 * CLIENT_ROLE_AUDIENCE(2):观众只能收流不能发流。如果你在频道中设置该角色,SDK 会自动调用 muteLocalAudioStream(true) 和 muteLocalVideoStream(true)。
 */
@SerializedName("agora_role")
private AgoraClientRoleType agoraClientRoleEnum;


2] 实时控制客户端用户声网身份转换的机制
我们APP中, 只有在 “麦位” 上的用户, 才能进行推流(也就是声网的主播身份), 在麦位下面的观众, 只有拉流权限,
所以当某个 “麦上嘉宾” 被服务器降级为 “普通观众” 时, 只需要更新房间的麦位信息, 把这个 “麦上嘉宾” 从麦位上移除,
客户端在收到最新的麦位信息时, 会去比对当前登录用户是否还是 “麦上嘉宾”, 如果不是了,
就调用 [请求用户声网Token & ClientRole 的接口] , 待该接口请求成功之后, 需要做如下操作 : 

int resultCode;
/**
 * 更新 Token。
 *
 * 详情该方法用于更新 Token。Token 会在一定时间后失效。在以下两种情况下,app 应重新获取 Token,
 * 然后调用该方法传入新的 Token,否则 SDK 无法和服务器建立连接:
 * 发生 onTokenPrivilegeWillExpire 回调时。
 * onConnectionStateChanged 回调报告 CONNECTION_CHANGED_TOKEN_EXPIRED(9) 时。
 * 参数
 * token
 * 新的 Token。
 * 返回值
 * 0: 方法调用成功。
 * < 0: 方法调用失败。
 * -2:传入的参数无效。例如,使用了不合法的 Token。你需要填入有效的参数。
 * -7:RtcEngine 对象尚未初始化。你需要在调用该方法前成功初始化 RtcEngine 对象。
 */
resultCode = getRtcEngine().renewToken(userAgoraInfo.getAgoraToken());
resultCode = getRtcEngine().setClientRole(getAgoraClientRoleConstantValue(userAgoraInfo.getAgoraClientRoleEnum()));

注意 : 一定要先调用 renewToken, 然后再调用  setClientRole



3] 客户端需要监听2个跟 token过期有关的回调


/**
 * Token 服务即将过期回调。
 * <p>
 * 在调用 joinChannel 时如果指定了 Token,由于 Token 具有一定的时效,在通话过程中如果 Token 即将失效,SDK 会提前 30 秒触发该回调,提醒 App 更新 Token。
 * 当收到该回调时,你需要重新在服务端生成新的 Token,然后调用 renewToken 将新生成的 Token 传给 SDK。
 *
 * @param token 即将服务失效的 Token
 */
@Override
public void onTokenPrivilegeWillExpire(String token) {

/**
 * Token 过期回调。
 * <p>
 * 在调用 joinChannel 时如果指定了 Token,
 * <p>
 * 由于 Token 具有一定的时效,在通话过程中 SDK 可能由于网络原因和服务器失去连接,重连时可能需要新的 Token。
 * <p>
 * 该回调通知 App 需要生成新的 Token,并调用 renewToken 更新 Token。
 */
@Override
public void onRequestToken() {


当收到这2个回调之后, 就调用 [请求用户声网Token & ClientRole 的接口], 接口请求成功之后, 请参考上面 2] 


4] 每个拥有声网主播身份的麦上嘉宾的声网Token, 建议设置有效时间为5分钟, 
然后客户端通过监听 onTokenPrivilegeWillExpire / onRequestToken 来进行token刷新.
这样做, 可以最大限度确保, 一个 “有问题的用户token” 的生存周期尽量短.


总结

“连麦鉴权” 功能最主要是为了 "防止黑客通过利用业务漏洞或盗取 Token 进行直播间炸房等行为”, 
如果不做 “连麦鉴权” 功能, 那么黑客一旦拿到你的声网token, 就可以对你的APP进行攻击.

推荐阅读
相关专栏
开发者实践
182 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。