浏览代码

声网签名

lyhzzz 2 年之前
父节点
当前提交
54e929d83e

+ 6 - 0
pom.xml

@@ -148,6 +148,12 @@
             <version>3.1.0</version>
         </dependency>
 
+
+        <dependency>
+            <groupId>io.agora</groupId>
+            <artifactId>authentication</artifactId>
+            <version>1.6.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 0
src/main/java/com/fdkankan/tk/common/ResultCode.java

@@ -33,6 +33,7 @@ public enum ResultCode {
 
     TENCENT_YUN_EMPTY(9001,"音视频未配置!"),
     TENCENT_YUN_ERROR(9002,"音视频有多配置!"),
+    AGO_ROLE_ERROR(9003,"声网角色Id错误!"),
 
 
     ;

+ 1 - 1
src/main/java/com/fdkankan/tk/common/util/RedisKeyUtil.java

@@ -1,8 +1,8 @@
 package com.fdkankan.tk.common.util;
 
 public class RedisKeyUtil {
-
     public  static  String AccessToken = "take-look:app_id:";
     public final static String TENCENT_YUN_KEY = "take-look:tencent:";
+    public final static String AGORA_KEY = "take-look:agora:%s:%s:%s";
 
 }

+ 10 - 2
src/main/java/com/fdkankan/tk/controller/TencentYunController.java

@@ -15,17 +15,25 @@ import org.springframework.web.bind.annotation.*;
  * @since 2022-09-27
  */
 @RestController
-@RequestMapping("/tencentYun")
 public class TencentYunController {
 
     @Autowired
     ITencentYunService tencentYunService;
 
 
-    @GetMapping("/getSign")
+
+    @GetMapping("/tencentYun/getSign")
     public ResultData getSign(@RequestParam(required = false) String userId){
         return ResultData.ok(tencentYunService.getSign(userId));
 
     }
+
+    @GetMapping("/agoraIO/getAgoraToken")
+    public ResultData getAgoraToken(@RequestParam(required = true) Integer userId,
+                                    @RequestParam(required = true) Integer roleId,
+                                    @RequestParam(required = true) String channelName){
+        return ResultData.ok(tencentYunService.getAgoraToken(userId,roleId,channelName));
+
+    }
 }
 

+ 2 - 2
src/main/java/com/fdkankan/tk/entity/TencentYun.java

@@ -32,10 +32,10 @@ public class TencentYun implements Serializable {
     private Integer id;
 
     @TableField("appid")
-    private Integer appid;
+    private String appid;
 
     @TableField("sdk_appid")
-    private Integer sdkAppid;
+    private Long sdkAppid;
 
     @TableField("secretkey")
     private String secretkey;

+ 2 - 0
src/main/java/com/fdkankan/tk/service/ITencentYunService.java

@@ -15,4 +15,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface ITencentYunService extends IService<TencentYun> {
 
     JSONObject getSign(String userId);
+
+    Object getAgoraToken(Integer userId,Integer roleId,String channelName);
 }

+ 50 - 0
src/main/java/com/fdkankan/tk/service/impl/TencentYunServiceImpl.java

@@ -10,9 +10,12 @@ import com.fdkankan.tk.mapper.ITencentYunMapper;
 import com.fdkankan.tk.service.ITencentYunService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.tencentyun.TLSSigAPIv2;
+import io.agora.media.RtcTokenBuilder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.security.Security;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -58,4 +61,51 @@ public class TencentYunServiceImpl extends ServiceImpl<ITencentYunMapper, Tencen
         jsonObject.put("expire",redisUtil.getExpire(redisKey));
         return jsonObject;
     }
+
+    static int tokenExpirationInSeconds = 3600;
+    static int privilegeExpirationInSeconds = 3600;
+
+    static HashMap<Integer,RtcTokenBuilder.Role> roleMap = new HashMap<>();
+    private void setRoleMap (){
+        roleMap.put(RtcTokenBuilder.Role.Role_Admin.initValue,RtcTokenBuilder.Role.Role_Admin);
+        roleMap.put(RtcTokenBuilder.Role.Role_Publisher.initValue,RtcTokenBuilder.Role.Role_Publisher);
+        roleMap.put(RtcTokenBuilder.Role.Role_Subscriber.initValue,RtcTokenBuilder.Role.Role_Subscriber);
+        roleMap.put(RtcTokenBuilder.Role.Role_Attendee.initValue,RtcTokenBuilder.Role.Role_Attendee);
+    }
+
+    @Override
+    public Object getAgoraToken(Integer userId,Integer roleId,String channelName) {
+        if(roleMap.size() <=0){
+            setRoleMap();
+        }
+        if(roleMap.get(roleId) == null){
+            throw new BusinessException(ResultCode.AGO_ROLE_ERROR);
+        }
+        String redisKey = String.format(RedisKeyUtil.AGORA_KEY ,channelName,roleId,userId);
+        if (!redisUtil.hasKey(redisKey)) {
+            List<TencentYun> list = this.list();
+            if(list == null || list.size() <=0){
+                throw new BusinessException(ResultCode.TENCENT_YUN_EMPTY);
+            }
+            if(list.size() >1){
+                throw new BusinessException(ResultCode.TENCENT_YUN_ERROR);
+            }
+            TencentYun tencentYun = list.get(0);
+            RtcTokenBuilder token = new RtcTokenBuilder();
+            String result = token.buildTokenWithUid(tencentYun.getAppid(), tencentYun.getSecretkey(), channelName, userId,roleMap.get(roleId) ,privilegeExpirationInSeconds);
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("sdkAppId",tencentYun.getSdkAppid());
+            jsonObject.put("expire",tencentYun.getExTime());
+            jsonObject.put("sign",result);
+            jsonObject.put("operatorType",tencentYun.getOperatorType());
+            redisUtil.set(redisKey ,jsonObject.toJSONString(),tencentYun.getExTime() - 60);
+            return jsonObject;
+        }
+        JSONObject jsonObject = JSONObject.parseObject(redisUtil.get(redisKey));
+        jsonObject.put("expire",redisUtil.getExpire(redisKey));
+        return jsonObject;
+    }
+
+
+
 }