瀏覽代碼

✨ feat(aliyun): 增加创建IM令牌时指定用户ID的功能

- 添加userId可选参数,用于指定创建令牌的目标用户
- 实现用户ID优先级逻辑:优先使用指定的userId,否则使用当前登录用户ID
- 更新API请求模型,添加userId字段说明文档

🐛 fix(auth): 修复用户信息验证逻辑错误

- 将用户信息验证移至未指定userId的分支中,避免不必要的验证
- 确保只有在未指定userId且当前用户信息无效时才返回401错误
yourname 2 月之前
父節點
當前提交
5158416ccb
共有 1 個文件被更改,包括 15 次插入4 次删除
  1. 15 4
      src/server/api/aliyun/index.ts

+ 15 - 4
src/server/api/aliyun/index.ts

@@ -15,6 +15,10 @@ const CreateImTokenRequest = z.object({
   role: z.string().openapi({
     description: '用户角色',
     example: 'teacher'
+  }),
+  userId: z.string().optional().openapi({
+    description: '用户ID(可选,用于指定其他用户)',
+    example: '12345'
   })
 });
 
@@ -149,14 +153,21 @@ const createRtcTokenRoute = createRoute({
 const app = new OpenAPIHono<AuthContext>()
   .openapi(createImTokenRoute, async (c) => {
     try {
-      const { role } = c.req.valid('json');
+      const { role, userId } = c.req.valid('json');
       const user = c.get('user');
 
-      if (!user || typeof user !== 'object' || !('id' in user)) {
-        return c.json({ code: 401, message: '用户信息无效' }, 401);
+      // 如果指定了userId,使用指定的userId;否则使用当前登录用户的id
+      let targetUserId: string;
+      if (userId) {
+        targetUserId = userId;
+      } else {
+        if (!user || typeof user !== 'object' || !('id' in user)) {
+          return c.json({ code: 401, message: '用户信息无效' }, 401);
+        }
+        targetUserId = user.id.toString();
       }
 
-      const { nonce, token, timestamp } = await generateImToken(user.id.toString(), role);
+      const { nonce, token, timestamp } = await generateImToken(targetUserId, role);
 
       return c.json({
         nonce,