自动登录相关
日期: 2021-03-02
创盛视联数码科技(北京)有限公司
[TOC]
1.1 直播间登录说明
登录链接相关API
1.1.1 老师、互动者端 实现自动登录说明
1、通过调用获取房间自动登录链接接口(https://ccapi.csslcloud.net/api/v1/room/auto_link)获取到对应角色登录地址
2、在原有地址拼接新参数 autoLogin、username 、password(autoLogin=true,username=设置的登录用户名,password=登录房间的密码如房间验证释放为免密时传空串即可)
示例
教师端:
https://class.csslcloud.net/index/presenter/?roomid=FC3548C1133061D09C33DC5901307461&userid=E9607DAFB705A798&username=XXX&password=XXX&autoLogin=true
互动者:
https://class.csslcloud.net/index/talker/?roomid=FC3548C1133061D09C33DC5901307461&userid=E9607DAFB705A798&username=XXX&password=XXX&autoLogin=true
1.1.2 旁听端实现自动登录说明
1、通过调用获取房间自动登录链接接口(https://ccapi.csslcloud.net/api/v1/room/auto_link)获取到对应角色地址
2、在原有地址拼接新参数 autoLogin、viewername 、viewertoken(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、通过调用查询回放列表接口(https://api.csslcloud.net/api/v2/record/info)获取回放地址
2、在原有地址拼接新参数 autoLogin、viewername 、viewertoken(autoLogin=true,viewername=设置的登录用户名,viewertoken=合流回放密码,如果房间验证方式为免密时传空即可)
示例
http://view.csslcloud.net/api/view/callback/login?liveid=xxx&roomid=xxx&userid=xxx&autoLogin=true&viewername=11&viewertoken=11
1.2.2 全景回放实现自动登录说明
方式一(推荐)
1、通过调用[全景回放列表接口](https://ccapi.csslcloud.net/openapi/recorder/replay_info)获取回放地址
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、通过调用全景回放列表接口(https://ccapi.csslcloud.net/openapi/recorder/replay_info)获取回放地址
2、在原有地址拼接新参数 autoLogin、username 、password(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.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 签名
使用java代码编写可参考如下:
//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);
}
}