自动登录说明
更新时间:2023-07-14
1.1 直播间登录说明
1.1.1 讲师、学员端实现自动登录说明
1、通过调用获取直播间自动登录链接获取到对应角色登录地址
2、在原有地址拼接新参数:
方案一:在原有地址拼接新参数:autoLogin、username 、password、login_uid(非必传)
方案二:在原有地址拼接新参数:autoLogin、sessionid
3、参数说明:
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
autoLogin | String | 是 | 是否自动登录,填写为true |
username | String | 否 | 登录用户名 |
password | String | 否 | 登录密码 |
login_uid | String | 否 | 对接方需保证唯一性,主要用于同一学员单点登录相关逻辑,不支持使用特殊字符如('-',':','?','&') |
sessionid | String | 否 | 登录凭证,通过创建登录Sessionid获取 |
示例
讲师端:
https://class.csslcloud.net/hdclass/#/presenter?roomid=CABA748B34C2C0F09C33DC5901307461&role=presenter&userid=119FA1480CB3EBAF&template=32&username=XXX&password=XXX&login_uid=xxx&autoLogin=true
学员端:
https://class.csslcloud.net/hdclass/#/talker?roomid=CABA748B34C2C0F09C33DC5901307461&role=talker&userid=119FA1480CB3EBAF&template=32&username=XXX&password=XXX&login_uid=xxx&autoLogin=true
sessionid方案:
https://class.csslcloud.net/hdclass/#/talker?roomid=CABA748B34C2C0F09C33DC5901307461&role=talker&userid=119FA1480CB3EBAF&template=32&sessionid=xxxx&autoLogin=true
1.1.2 旁听端实现自动登录说明
1、通过调用获取直播间自动登录链接获取到对应角色登录地址
2、在原有地址拼接新参数 autoLogin、viewername 、viewertoken,注意和讲师学员端参数名不一样
3、参数说明:设置autoLogin=true,viewername=设置的登录用户名,viewertoken=登录直播间的密码,如直播间验证方式为免密时传空即可
示例
旁听端:
http://view.csslcloud.net/api/view/index?roomid=xxx&userid=xxx&autoLogin=true&viewername=11&viewertoken=11
1.1.3 备注
注:如果自动登录验证成功,则进入直播页面;如果验证失败,则跳到登录页面,显示错误提示信息。
1.2 直播回放说明
回放相关API
1.2.1 普通合流回放实现自动登录说明
1、通过调用查询回放列表接口获取回放地址
2、在原有地址拼接新参数 autoLogin、viewername 、viewertoken
3、参数说明:设置 autoLogin=true,viewername=设置的登录用户名,viewertoken=合流回放密码,如果直播间验证方式为免密时传空即可
示例
https://view.csslcloud.net/api/view/index?roomid=CABA748B34C2C0F09C33DC5901307461&userid=119FA1480CB3EBAF&from=class&autoLogin=true&viewername=11&viewertoken=11
1.2.2 全景回放实现自动登录说明
方式一
1、通过调用全景回放列表接口获取回放地址
2、在原有返回地址拼接新参数 autoLogin、username 、password
3、参数说明:设置 autoLogin=true,username=设置的登录用户名,password=登录直播间的密码如直播间验证释放为免密时传空串即可
示例
https://class.csslcloud.net/flashback/index.html#/?userid=3D6D13FB0C0456F7&roomid=E334895D6BCC7EFB9C33DC5901307461&liveid=9745C8F63D5804FF&recordid=5802A64F3B26D9B7&autoLogin=true&username=123&password=xx
方式二(推荐)
1、通过调用全景回放列表接口获取回放地址
2、在原有地址拼接新参数autoLogin、token(autoLogin=true,token 为验证标识,需要按一定规则拼接)
3、token参数是基于username、password采用JWT加密编码方式生成避免明文传输
示例
https://class.csslcloud.net/flashback/index.html#/?userid=3D6D13FB0C0456F7&roomid=E334895D6BCC7EFB9C33DC5901307461&liveid=9745C8F63D5804FF&recordid=5802A64F3B26D9B7&autoLogin=true&token=xxxx
1.2.3 全景回放实现自动登录token生成规则
说明:自动登录时为了避免在地址上明文显示username、password 采用JWT方式生成token进行传输
具体规则:
JWT header头部设置为:
{
"alg": "HS256"
}
JWT playload 载荷设置为:
{
"userName": "123",//用户名
"cipher": "111", //口令密码
"exp": 失效截止时间戳,毫秒数//永久有效该字段可不设置
}
JWT SECRET 设置为 userId+apiKey(开发者账号+开发者apiKey 具体可在admin后台查看)
最后使用JWT工具类库生成token 签名
//pom添加依赖
/**
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>6.0</version>
</dependency>
**/
@Slf4j
public class JWTHS256TUtil {
/**
* 加解密秘钥 规则(userId+apiKey)改成开发者自己的userId+apiKey
*/
private static final byte[] SECRET = ("88F5B1FCDE30281C"+"iNZhRenb9ThKClW8T5Yvs7mmFs3AhXE6").getBytes();
/**
* 过期时间12小时
*/
private static final long EXPIRE_TIME = 12*60*60*1000;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
public static class AuthTokenDTO {
/**
* 用户名
*/
private String userName;
/**
* 口令、密码
*/
private String cipher;
/**
* 失效时间 截止失效时间戳 毫秒数
*/
private Long exp;
}
/**
* 创建token
* @param authTokenDTO
* @return
*/
public static String createToken(AuthTokenDTO authTokenDTO){
//建立一个头部Header采用HS256
JWSHeader jwsHeader = new JWSHeader(JWSAlgorithm.HS256);
//改成自己项目对应的JSON工具库
JacksonSimpleMapper jacksonSimpleMapper = new JacksonSimpleMapper();
try {
//建立一个载荷Payload
Payload payload = new Payload(JSONObjectUtils.parse(jacksonSimpleMapper.parseToJsonString(authTokenDTO)));
//将头部和载荷结合在一起
JWSObject jwsObject = new JWSObject(jwsHeader, payload);
//建立一个密匙
JWSSigner jwsSigner = new MACSigner(SECRET);
//签名
jwsObject.sign(jwsSigner);
//生成token
return jwsObject.serialize();
}catch (Exception e){
//处理异常
System.out.println(ExceptionUtils.getStackTrace(e));
throw new RuntimeException(e);
}
}
/**
* 解析token
* @param token
* @return
*/
public static AuthTokenDTO valid(String token){
try {
JWSObject jwsObject = JWSObject.parse(token);
//获取到载荷
Payload payload=jwsObject.getPayload();
//建立一个解锁密匙
JWSVerifier jwsVerifier = new MACVerifier(SECRET);
//判断token
if (jwsObject.verify(jwsVerifier)) {
//载荷的数据解析成json对象。
JSONObject jsonObject = payload.toJSONObject();
//改成自己项目对应的JSON工具库
JacksonSimpleMapper jacksonSimpleMapper = new JacksonSimpleMapper();
AuthTokenDTO authTokenDTO = jacksonSimpleMapper.parseToObject(jsonObject.toJSONString(),AuthTokenDTO.class);
if(authTokenDTO.getExp() != null && authTokenDTO.getExp() < System.currentTimeMillis()){
//处理对应过期逻辑 改成自己项目对应处理方式
throw new RuntimeException("已过期");
}
return authTokenDTO;
}else {
//处理校验不通过逻辑 改成自己项目对应处理方式
throw new RuntimeException("检验不通过");
}
}catch (Exception e){
//处理异常
System.out.println(ExceptionUtils.getStackTrace(e));
throw new RuntimeException(e);
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
AuthTokenDTO authTokenDTO = new AuthTokenDTO();
//失效时间12小时
authTokenDTO = authTokenDTO.setExp(System.currentTimeMillis()+EXPIRE_TIME).setUserName("bokecc.com").setCipher("123333");
//测试生成token
String token = JWTHS256TUtil.createToken(authTokenDTO);
System.out.println(token);
//测试解析token
AuthTokenDTO authTokenDTO1 = JWTHS256TUtil.valid(token);
System.out.println(authTokenDTO1);
}
}