自动登录相关

日期: 2021-03-02

创盛视联数码科技(北京)有限公司

[TOC]

1.1 直播间登录说明

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 直播回放说明

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.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);
    }
}

results matching ""

    No results matching ""