Просмотр исходного кода

增加了token获取登录用户信息

liyuezong лет назад: 2
Родитель
Сommit
1e9cde3fcb
4 измененных файлов с 120 добавлено и 35 удалено
  1. 49 33
      pro/src/appweb_handle.c
  2. 1 1
      pro/src/common.c
  3. 69 1
      pro/src/json_handle.c
  4. 1 0
      pro/src/json_handle.h

+ 49 - 33
pro/src/appweb_handle.c

@@ -329,18 +329,38 @@ void* update_thread(void* arg)
 /// @param stream 
 static void systemConfiguration(void* conn)
 {
-    char* ack_str = NULL ;
+    char *ack_str = NULL;
+    char* rx_Head_buf = NULL;
+    char *g_token = NULL;
+
+#ifdef USE_WEBAPP
+    HttpStream *s = (HttpStream *)conn;
+    rx_Head_buf = (char *)httpGetHeader(s, "Authorization");
+    usleep(500000);
+#else
+    mg_stream_t *s = (mg_stream_t *)conn;
+    struct mg_http_message *msg = s->ev_data;
+    rx_Head_buf = (char *)msg->head.ptr;
+#endif
 
-    if (!CheckLoginStatus(NULL))
+    g_token = json_to_Token_info(rx_Head_buf);
+    // 检查token是否有效
+    if (g_token != NULL && !CheckLoginStatus(g_token))
     {
         ack_str = log_AthFailedinfo_to_json();
         http_reply(conn, 401, ack_str);
-        return ;      
+    }
+    else
+    {
+        ack_str = json_to_system_config_info();
+        http_reply(conn, 200, ack_str);
     }
 
-    ack_str = json_to_system_config_info();
-    http_reply(conn, 200, ack_str);
-    cJSON_free((void*)ack_str);
+    if (g_token != NULL)
+    {
+        free(g_token);
+    }
+    cJSON_free((void *)ack_str);
 }
 
 /// @brief 多语言切换
@@ -497,11 +517,29 @@ static void getUserInfo(void* conn)
 static void getUserRouters(void* conn)
 {
     char* ack_str = NULL ;
-    char* rx_body_buf = NULL;
+    char* rx_Head_buf = NULL;
+    char* g_token=NULL;
+
+#ifdef USE_WEBAPP
+    HttpStream *s=(HttpStream*)conn;
+    rx_Head_buf = (char*)httpGetHeader(s,"Authorization");
+    usleep(500000);
+#else
+    mg_stream_t *s=(mg_stream_t*)conn;
+    struct mg_http_message *msg=s->ev_data;
+    rx_Head_buf = (char*)msg->head.ptr;
+#endif
 
+    g_token = json_to_Token_info(rx_Head_buf);
+    // 根据token获取用户及用户权限
     ack_str = user_routers_info_to_json();
     http_reply(conn, 200, ack_str);
 
+    if (g_token != NULL)
+    {
+        free(g_token);
+   }
+
     cJSON_free((void*)ack_str);
 }
 
@@ -536,14 +574,6 @@ static void overallStatusMonitoring(void* conn)
         return ;        
     }
 
-    //检查token是否有效
-    if (!CheckLoginStatus( _over_all_sts_monitor.user_token))
-    {
-        ack_str = log_AthFailedinfo_to_json();
-        http_reply(conn, 401, ack_str);
-        return ;       
-    }
-
     //总电压电流信息
     if(strcmp(_over_all_sts_monitor.type,"listQuery")==0)
     {
@@ -971,13 +1001,6 @@ static void channelStatusMonitoring(void* conn)
         return ;        
     }
 
-    if (!CheckLoginStatus( _over_chn_pwr_request.user_token))
-    {
-        ack_str = log_AthFailedinfo_to_json();
-        http_reply(conn, 401, ack_str);
-        return ;      
-    }
-
     #if(1)
     //查询
     if(strcmp(_over_chn_pwr_request.type,"listQuery")==0||strcmp(_over_chn_pwr_request.type,"resetChannel")==0)
@@ -1654,25 +1677,25 @@ static void sensorStatusMonitoring(void* conn)
                         strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.comSlogan);
                     }
                 }
-                else if (strcmp(_over_all_sensor_request.cgqtd, "IN1") == 0)
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN3") == 0)
                 {
                     _globalSensorMangerTemp->sensor_interface_type = 2;
                     _globalSensorMangerTemp->sensor_addr = 0;
                     strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
                 }
-                else if (strcmp(_over_all_sensor_request.cgqtd, "IN2") == 0)
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN4") == 0)
                 {
                     _globalSensorMangerTemp->sensor_interface_type = 2;
                     _globalSensorMangerTemp->sensor_addr = 1;
                     strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
                 }
-                else if (strcmp(_over_all_sensor_request.cgqtd, "IN3") == 0)
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN2") == 0)
                 {
                     _globalSensorMangerTemp->sensor_interface_type = 2;
                     _globalSensorMangerTemp->sensor_addr = 2;
                     strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
                 }
-                else if (strcmp(_over_all_sensor_request.cgqtd, "IN4") == 0)
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN1") == 0)
                 {
                     _globalSensorMangerTemp->sensor_interface_type = 2;
                     _globalSensorMangerTemp->sensor_addr = 3;
@@ -3445,13 +3468,6 @@ static void equipmentMintenance(void *conn)
         return ;
     }
 
-    if (!CheckLoginStatus( _Over_equipment_mintenance.user_token))
-    {
-        ack_str = log_AthFailedinfo_to_json();
-        http_reply(conn, 401, ack_str);
-        return ;        
-    }
-
     //查询设备列表
     if(strcmp(_Over_equipment_mintenance.type,"listSbRestartQuery")==0 || strcmp(_Over_equipment_mintenance.type,"listSbWhQuery")==0)
     {

+ 1 - 1
pro/src/common.c

@@ -425,7 +425,7 @@ int is_process_running(const char *process_name)
 
 bool CheckLoginStatus(char* Token)
 {
-    return true;//先不处理401授权错误,待前端处理后再加 20240625 lyz
+    //return true;//先不处理401授权错误,待前端处理后再加 20240625 lyz
     
     // 没有用户登录
     int nLoginNum=0;

+ 69 - 1
pro/src/json_handle.c

@@ -79,7 +79,7 @@ char* log_AthFailedinfo_to_json()
     // 添加基本键值对
     cJSON_AddNumberToObject(root, "code", 401); 
     //添加结果
-    cJSON_AddStringToObject(root, "msg", "登录超时!");
+    cJSON_AddStringToObject(root, "msg", "获取用户账户异常");
     //转换
     str = cJSON_Print(root); 
     //释放资源
@@ -728,6 +728,74 @@ char* user_routers_info_to_json(void)
     return str;  
 }
 
+
+/// @brief 获取请求的token信息
+/// @param str 
+/// @param 
+/// @param  
+/// @return 
+char* json_to_Token_info(const char* strHead)
+{
+    if (strHead==NULL)
+    {
+       return NULL;
+    }
+    
+    const char *Token_start = strstr(strHead, "Authorization:");
+    if (Token_start == NULL)
+    {
+        // 如果没有找到Authorization头部,则返回NULL
+        return NULL;
+    }
+    // 跳过"Authorization:"和可能存在的空格
+    Token_start += 14; // 14是"Authorization:"的长度
+    while (*Token_start == ' ' || *Token_start == '\t')
+    {
+        Token_start++;
+    }
+
+    const char *auth_start = strstr(Token_start, "Bearer");
+    if (auth_start == NULL)
+    {
+        // 如果没有找到Bearer头部,则返回NULL
+        return NULL;
+    }
+    // 跳过"Bearer"和可能存在的空格
+    auth_start += 6; //6是"Bearer"的长度
+        while (*auth_start == ' ' || *auth_start == '\t')
+    {
+        auth_start++;
+    }
+
+    // 找到头部的结束位置(即下一个"\r\n")
+    const char *auth_end = strstr(auth_start, "\r\n");
+    if (auth_end == NULL)
+    {
+        // 如果没有找到头部结束,则可能是格式不正确的HTTP请求
+        // 这里简单返回NULL,但实际应用中可能需要更复杂的错误处理
+        return NULL;
+    }
+
+    // 计算需要复制的字节数(不包括"\r\n")
+    size_t auth_len = auth_end - auth_start;
+
+    if (auth_len>=64 || auth_len<0 )
+    {
+        // 长度超过64字节,则认为格式不正确,返回NULL
+        return NULL;
+    }
+
+    // 分配内存并复制Authorization头部的值
+    char* auth_value = (char*)malloc(auth_len + 1); // 加1是为了'\0'  
+    if (auth_value != NULL) {  
+        memcpy(auth_value, auth_start, auth_len);  
+        auth_value[auth_len] = '\0'; // 添加字符串结束符  
+    }  
+  
+    return auth_value; 
+}
+
+
 /// @brief 获取登录用户信息
 /// @param str 
 /// @param _over_all_sts_ 

+ 1 - 0
pro/src/json_handle.h

@@ -460,6 +460,7 @@ typedef struct
 char* ctrl_sts_ack_to_json(void);
 
 void get_rand_str(char* s,int num);
+char* json_to_Token_info(const char* strHead);
 int json_to_User_login_info(const char* str,_User_Log* _newUserLogin);
 int json_to_User_loginOut_info(const char* str,char** _UserLoginOutToken);
 char* log_info_to_json(const char* token);