自动登录说明

更新时间: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);
    }
}

results matching ""

    No results matching ""