使用nginx給網站添加身份認證

使用nginx給網站添加身份認證

basic auth

默認狀況下nginx已經安裝了ngx_http_auth_basic_module模塊,若是不須要這個模塊,能夠加上 --without-http_auth_basic_module 。php

nginx basic auth指令

語法: auth_basic string | off; 默認值: auth_basic off; 配置段: http, server, location, limit_excepthtml

默認表示不開啓認證,後面若是跟上字符,這些字符會在彈窗中顯示。nginx

語法: auth_basic_user_file file; 默認值: — 配置段: http, server, location, limit_except數據庫

用戶密碼文件,文件內容相似以下:apache

username:passwd:comment
用戶名:密碼:註釋
  1. 使用htpasswd工具加密密碼vim

    sudo apt install apache2-utils
    sudo htpasswd /usr/local/nginx/conf/htpasswd username //輸入兩遍密碼
  2. 修改nginx配置瀏覽器

    sudo vim /usr/local/nginx/conf/nginx.conf
    在http段添加:
        auth_basic "nginx basic http auth test for auth.test.com";
    	auth_basic_user_file /usr/local/nginx/conf/htpasswd;
    	autoindex_exact_size off;
    	autoindex_localtime on;
    	autoindex on;
  3. 重啓nginx服務服務器

    sudo nginx -t
    sudo nginx -s reload
  4. 去瀏覽器驗證如今訪問域名下的資源都須要先登錄認證才能夠工具

ngx_http_auth_request_module 第三方認證

編譯 Nginx 時須要添加該模塊 --with-http_auth_request_module 該模塊能夠將客戶端輸入的用戶名、密碼 username:password 經過 Base64 編碼後寫入 Request Headers 中 例如:wang:wang -> Authorization:Basic d2FuZzp3YW5n= 而後經過第三方程序解碼後跟數據庫中用戶名、密碼進行比較,Nginx 服務器經過 header 的返回狀態判斷是否定證經過。網站

  • 編輯nginx配置文件
server {
    listen 80;
    server_name local.server.com;

    auth_request /auth;

    location / {
        root   html;
        index  index.html;
    }

    location /auth {
        proxy_pass http://auth.server.com/HttpBasicAuthenticate.php;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }
}

# auth_request /auth; # 啓用認證
# proxy_pass http://auth.server.com/HttpBasicAuthenticate.php; # 認證服務器地址
# 參考地址:http://nginx.org/en/docs/http/ngx_http_auth_request_module.html
  • 添加第三方認證服務器

    vim /usr/local/nginx/conf/vhost/auth.conf  # 這是第三方認證服務器,認證邏輯使用的 PHP 代碼
    
    server {
        listen       80;
        server_name  auth.server.com;
        root /usr/local/nginx/auth;
    
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx-1.10.2/html$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
  • 添加認證程序

    vim /usr/local/nginx/auth/HttpBasicAuthenticate.php
    
    <?php
    if(isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])){
        $username = $_SERVER['PHP_AUTH_USER'];
        $password = $_SERVER['PHP_AUTH_PW'];
    
        if ($username == 'wang' && $password == '123456'){
            return true;
        }
    }
    
    header('WWW-Authenticate: Basic realm="Git Server"');
    header('HTTP/1.0 401 Unauthorized');
  • 用戶訪問 local.server.com 彈出框中輸入的用戶名、密碼保存在 $_SERVER 變量中 中間 if 段,只作演示用,工做中應該是拿用戶輸入的用戶名、密碼跟數據庫中的數據作比較 用戶訪問 local.server.com 就會去 auth.servere.com 作用戶認證,認證經過後繼續訪問 local.server.com

相關文章
相關標籤/搜索