Nginx+fastcgi+c語言+jQuery等技術實現設備端web登陸

第一步:熟悉Nginx的ngx_http_auth_request_module模塊,具體見官網:http://nginx.org/en/docs/http/ngx_http_auth_request_module.html;html

第二步:Nginx須要引入ngx_http_auth_request_module模塊,而後配置conf文件,具體配置以下: 注意紅框的知識點前端

第三步(1):配置完以後,先完成前端,將用戶名和密碼base64以後,以?墜在接口後面,相似於Get發送數據的那樣,發送給後臺。nginx

第三步(2):配置完以後,先完成前端,將用戶名和密碼base64以後,放在RequestHeader裏面發送給後臺。數組

個人主要思路以下(盧老師的思路與指導): 用戶名密碼的存儲在這裏用的是h5的sessionStorage,主要是由於關閉頁面就清空的特色session

第四步:編寫auth接口,費了老大勁,我真的是不會c語言,通過這一次,更加不喜歡;app

兩種方法:函數

第一種,對應第三步(1):用cgi的環境變量去獲取前端發送的base64以後的用戶名和密碼,而後和從設備中獲取到的用戶名密碼,進行比對,若是相同則返回200,繼續執行請求的接口;若是返回401,則報錯/或者load登陸頁面;編碼

第二種,對應第三步(2):用fastcgi內置的FCGX_GetParam函數去獲取對應的RequsetHeader裏面的base64以後的用戶名和密碼,後面的操做和第一種的同樣;.net

// 具體步驟以下:
   // 第一種:
                // 首先獲取接口的字符串
                queryString = getenv("QUERY_STRING");
                // 而後判斷是否爲空
                 if (queryString != NULL) {
                    //若是不爲空,則 獲取Authorization
                    //memset函數是爲了清空字符數組,以避免累加出錯
                    memset(Authorization, 0, 60);
                    //sscanf函數截取字符串,可是這個函數有一個缺點就是遇到空格就會終止,有可能報錯,所            以用戶名和密碼的限定須要前端作好
                    sscanf(queryString, "Authorization=%s", Authorization);


                     // 調用共享變量
                     app_en_men();
                    // 獲取後臺已經有的用戶名和密碼
                     memset(username, 0, 20);
                     memset(psw, 0, 20);
                    strcpy(username, shared_sys_param_w->loginID);
                    strcpy(psw, shared_sys_param_w->loginpasswd);
                    
                     // 拼接字符串
                    memset(user, 0, 60);
                    strcat(user, username);
                    strcat(user, ":");
                    strcat(user, psw);
                    // 因爲拼接後的字符串可能存在空格,空格在編碼成base64的時候也看成一個有效字符,爲了不出錯,刪除字符串的空格
                    // 刪除拼接後的字符串裏的空格
                    delSpace(user);
                    
                     // 比較一下,若是相同,則說明返回200,正常登陸
                    if (strcmp(Authorization, base64_encode(user)) == 0) {
                            printf("Status: 200 Ok\nContent-type: text/plain\n\n");
                            continue;
                    }
                    
                }
                // 若是爲空或者不相同,則返回401,從新登陸
                printf("Status: 401 Unauthorized\nContent-type: text/plain\n\n");
    //    PS:這種方式有一個缺點,直接去訪問/auth接口的時候是沒有問題的,可是因爲有不少頁面,剛開始去請求數據的時候都須要去驗證當前頁面是否已經登陸,這就須要將用戶名和密碼墜到當前去請求的這個接口,好比/upload_cgi?auth=xxx這樣,一運行頁面,cgi直接掛掉,我也沒找出爲何,但願有高人能夠分享;


//    第二種:
             // 爲了後面用到的一些變量,提早聲明
             // for FCGX_Accept
            FCGX_Stream *in, *out, *err;
            FCGX_ParamArray envp;
            
            // fastcgi必須的步驟
            while (FCGX_Accept(&in, &out, &err, &envp) >= 0) {
                 // 獲取頭信息裏面的認證信息,用這個函數需喲啊注意的是,第一個參數必須是HTTP_xxx,並且第二個參數必須用FCGX_ParamArray來聲明
                b64_auth = FCGX_GetParam("HTTP_AUTHORIZATION", envp);
                
                // 獲取到的數據不爲空
                if (b64_auth != NULL) {

                  //  其中的操做和第一種同樣,這裏再也不贅述
                    
                }
                //獲取到的數據爲空或者是和設備端的數據不匹配,返回401
                FCGX_FPrintF(out, "Status: 401 Unauthorized\nContent-type: text/plain\n\n");
                FCGX_PutS("error: no auth or wrong.\n", out);
            }
//    PS:這一種是我如今用的,目前乜有發現存在的BUG,若有高人發現,請指教哦

//最後:謝謝一直陪在我身後的超級牛掰的盧老師https://my.oschina.net/lpe234, 在他的幫助下,我一直在進步!code

相關文章
相關標籤/搜索