配置示例
location / {
auth_basic "my site";
auth_basic_user_file conf/htpasswd;
}
指令說明
auth_basic
語法: auth_basic string | off;
默認值: auth_basic off;
上下文: http,server,location,limit_except
開啟使用“HTTP基本認證”(HTTP Basic Authentication)協議的用戶名密碼驗證。指定的參數被用作域。參數可以包含變量(1.3.10,1.2.7)。參數off可以取消繼承自上一個配置等級auth_basic指令的影響。參數off表示不開啟HTTP基本認證。
另外auth_basic指定的字符串會在彈窗中顯示。
auth_basic_user_file
語法: auth_basic_user_file file;
默認值: —
上下文: http,server,location,limit_except
指定保存用戶名密碼的文件,格式如下:
# comment
name1:password1
name2:password2:comment
name3:password3
參數file中可以包含變量。
密碼應該使用crypt()函數加密??梢杂肁pache HTTP Server發行包中的htpasswd命令或者openssl passwd來創建此類文件。
參數file可以是文件、相對路徑的文件、絕對路徑的文件。非絕對路徑下,文件的位置是相對于nginx安裝路徑下的conf目錄的。比如nginx的安裝路徑是/usr/local/nginx,則設置對應的路徑舉例說明如下:
auth_basic_user_file htpasswd;
# htpasswd在機器上的位置:/usr/local/nginx/conf/htpasswd
auth_basic_user_file conf/htpasswd;
# htpasswd在機器上的位置:/usr/local/nginx/conf/conf/htpasswd
auth_basic_user_file /tmp/htpasswd;
# htpasswd在機器上的位置:/tmp/htpasswd
創建用戶名為admin,密碼為12345的示例如下
htpasswd
[root@test ~]# /opt/apache/bin/htpasswd -bdc htpasswd admin 12345
Adding password for user admin
[root@test ~]# cat htpasswd
admin:PbSRr7orsxaso
openssl passwd
[root@test ~]# openssl passwd 12345
fIHcRVEKijgoM
[root@test ~]# echo "admin:fIHcRVEKijgoM" > htpasswd
[root@test ~]# cat htpasswd
admin:fIHcRVEKijgoM
變量說明
$remote_user
為HTTP基本認證提供的用戶名。例如上述圖和示例中提到的用戶admin。
補充說明
auth_basic、auth_basic_user_file指令由ngx_http_auth_basic_module模塊提供。
HTTP基本認證的流程如下:
-
客戶端發送HTTP請求給服務器,服務器驗證該用戶是否已經登錄驗證過了,如果沒有的話,服務器會返回一個401 Unauthozied給客戶端,并且在響應頭的WWW-Authenticate字段中添加相關信息。如下圖所示:
-
瀏覽器在接收到401響應后,會彈出登錄驗證的對話框。用戶輸入用戶名和密碼后,瀏覽器用BASE64編碼,放在請求頭的Authorization字段中發送給服務器。如下圖:
服務器將Authorization字段中的用戶名密碼取出,進行驗證,如果驗證通過,將根據請求,發送資源給客戶端。如果驗證失敗服務器還會返回401給客戶端,繼續重復步驟2和步驟3。
nginx可以通過如下幾種方式來限制訪問
- 密碼,即HTTP基本認證,ngx_http_auth_basic_module模塊
- 地址,ngx_http_access_module模塊
- 子請求結果,ngx_http_auth_request_module模塊,1.5.4+
- JWT,ngx_http_auth_jwt_module模塊,1.11.3
使用satisfy指令就能限制是否需要同時通過地址和密碼來限制訪問。
另外,Linux命令行中,可以通過如下命令驗證HTTP基本認證:
curl -u username:password URL
如
curl -u admin:12345 http://127.0.0.1