第一步:熟悉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裏面發送給後臺。數組
個人主要思路以下(盧老師的思路與指導): 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