使用 Token 鉴权
为保证实时通信的安全,应用客户端加入 RTC 房间通信时需要传入 Token 参数,进行鉴权。此 Token 来自您的应用服务端,由应用服务端在加入房间时,根据 RTC AppID、RTC AppKey、需要加入的 RoomName、加入房间时使用的 RTC Uid、时间戳等参数实时生成。
RTC 服务端在收到进房请求时,会校验进房请求中携带的 Token 信息,如果校验不成功,进房会失败。
1、鉴权流程
- 当App需要使用RTC服务时,向AppServer(后端服务器)请求Token;
- AppServer根据token生成算法以及相应的AppKey生成相应的Token,并下发给App;
- App在调用RTC SDK时,提供Token;
- SDK在与RTC后端服务器发起http/websocket连接时提供Token参数;
- RTC后端对token进行验证,验证不通过时会拒绝访问;验证通过,则提供RTC服务。
2、部署token生成服务
为了实现上述的鉴权机制,需要在您的AppServer上部署Token生成服务。
2.1 Token计算参数
- AppID:由baiduRTC提供,全局唯一,用于识别应用;
- AppKey: 由baiduRTC提供,每个AppID拥有一个AppKey,并且可更新;您可以登录百度智能云- 并进入RTC控制台查看AppID和AppKey。
- RoomName: 房间名称,由客户指定并维护;
- Uid: 用户id,由客户指定并维护,客户保证其唯一性;
- ts: token生成时的秒级别unix时间戳;
- ExpectTS: 过期时间,秒级别unix时间戳;
- Version:鉴权版本,当前取值004。
需要注意的是,Token与AppID+RoomName+Uid对是唯一绑定关系,不可以将一个正确的token用于其它的AppID+RoomName+Uid对。
2.2 Token计算步骤
- 输入需要的6个参数。
- 生成当前秒级别时间戳ts。格式需要转换为十进制Unix时间戳。推荐一个在线转换网站
- 生成randomString。随机一个int型整数,并转成对应16进制数字字符串,并补齐至8位。
- 生成签名。使用HmacSHA1算法加密来计算签名,结果返回16进制字符串。 key=appKey; data="ACS"(固定的ACS三个字母) + appID + ts + randomString + roomName + uid + expectTs; signature = HamcSHA1(key, data);
- 拼接token
token = version + signature + ts + randomString + expectTs;
2.3 Token格式
字段 | 说明 | 长度 | 示例 |
---|---|---|---|
version | 鉴权版本 | 3 | 004 |
ts | token生成时的秒级别unix时间戳 | 10字符 | 154476606 |
signature | 签名 | 40字符 | 8f50a1f280e69f4581dd8bf8b3b9cc9d277cd3a6 |
randomString | salt string,int转16进制字符串 | 8字符,不足补0 | dabdd97c |
expectTs | 过期时间,秒级别unix时间戳 | 10字符 | 1578380254 |
3、计算示例
准备好的各参数为: appID: app-jcagj2g5ecrqv7bn
version: 004
ts: 1553144847
randomString: dabdd97c
expectTs: 1578380254
roomName:aaa
uid: 54321
AppKey: s-jcagj2g5eewai6u3p3
计算得signature: HamcSHA1(s-jcagj2g5eewai6u3p3, ACSapp-jcagj2g5ecrqv7bn1553144847dabdd97caaa543211578380254) = 08b1a06afc9c138625dc7fc9ab5e7770c5156f23
构造token为:00408b1a06afc9c138625dc7fc9ab5e7770c5156f231553144847dabdd97c1578380254
您可以下载token生成示例代码进行参考(示例代码包含JAVA和Python两种语言)。
您也可以使用token在线生成工具来生成token; 使用token在线校验工具来校验token。