Nginx:使用认证服务器

我参考了这个页面。
使用Nginx和自定义的认证系统结合起来来限制安全资源。

将Docker进行克隆

git clone https://github.com/pistatium/nginx_auth_sample.git

启动 (qǐ

docker-compose up -d

启动后的状态

CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS         PORTS                                   NAMES
627804db9fdc   nginx:alpine        "/docker-entrypoint.…"   18 hours ago   Up 8 minutes   0.0.0.0:8000->80/tcp, :::8000->80/tcp   nginx_auth_sample_nginx_1
a0664adf4efd   python:3.6-alpine   "/bin/sh -xcv 'pip i…"   18 hours ago   Up 8 minutes                                           nginx_auth_sample_backend_1

有两个容器在奔跑。

    1. nginx_auth_sample_nginx_1

 

    1. 该处运行着Nginx。

 

    1. nginx_auth_sample_backend_1

 

    运行着Flask的认证服务器。

使用浏览器访问以下地址:
http://http://localhost:8000/

即使现在这样,您也可以确认认证服务器的功能,但我将进行修改以使其更易理解。

将Nginx 进行改编

登入

docker exec -it nginx_auth_sample_backend_1 ash
$ docker exec -it nginx_auth_sample_nginx_1 ash
/ # cd /var/www/html
/var/www/html #

将/var/www/html/index.html进行修改

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Nginx auth example</title>
</head>
<body>
<h1>Nginx auth example</h1>

<p>
    <a href='/private/index.html'>/private/index.html</a> is a page requiring lo
</p>
<h2>Preview</h2>
<p>
    <a id='login' href='/auth/login'>[[ Login ]]</a>
    <a id='logout' href='/auth/logout'>[[ Logout ]]</a>
</p>
<hr />
<h2>/auth/is_login/</h2>
<iframe src='/auth/is_login' width="800" height="200">                          
</iframe>                                              
<h2>/private/</h2>                                     
<iframe src='/private/' width="800" height="600">      
</iframe>                                              
<p>Jun/01/2023 AM 09:45</p>                            
</iframe>                                             
</body>                                               
</html>

对 /var/www/html/private/index.html 进行修改

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Nginx auth sample</title>
</head>
<body>
<h1>Secret Page</h1>
It is a page that only the person who logs in is seen.
....

<img src="/private/cat.jpg">

<br />
<a href="./aaa/">aaa</a><br />
<a href="./bbb/">bbb</a><br />
<br />
Jun/01/2023 AM 09:13<br />
</body>
</html>

创建以下目录:
/var/www/html/private/aaa/index.html
/var/www/html/private/bbb/index.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>aaa</title>
</head>
<body>
<p>aaa</p>
<p>Jun/01/2023</p>
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>bbb</title>
</head>
<body>
<p>bbb</p>
<p>Jun/01/2023</p>
</body>
</html>

Flask(改装认证服务器)

登录

docker exec -it nginx_auth_sample_backend_1 ash
$ docker exec -it nginx_auth_sample_backend_1 ash
/opt/backend # cd src
/opt/backend/src #

对 /opt/backend/src/app.py 进行修改

@app.route(‘/auth/is_login’) 进行修改。

# coding: utf-8

from flask import Flask, request, make_response, redirect, abort

app = Flask(__name__)

SESSION_KEY = 'SESSION'


@app.route('/auth/login')
def login():
    response = make_response(redirect('/'))
    response.set_cookie(SESSION_KEY, '1')  # FIXME
    return response


@app.route('/auth/logout')
def logout():
    response = make_response(redirect('/'))
    response.set_cookie(SESSION_KEY, '', expires=0)  # Delete cookie    
    return response                                                         
@app.route('/auth/is_login')                                            def is_login():                                                         
    # FIXME                                                             
    if not request.cookies.get(SESSION_KEY):                            
        abort(401)                                                      
    return '*** OK ***'  # 200

使用浏览器访问

 

请清除浏览记录并进行测试。

image.png
image.png

在下面的URL中,根据您是否登录,显示内容会有所不同。
http://localhost:8000/private/aaa/
http://localhost:8000/private/bbb/

image.png
image.png

Nginx的配置文件

server {
    server_name _;
    listen 80;
    access_log /dev/stdout;
    error_log /dev/stderr warn;
    root /var/www/html;
    index index.html;

    location /private/ {
        auth_request /auth/is_login;
    }
    
    location /auth {
        proxy_pass http://backend:8888;
        proxy_redirect off;
        proxy_set_header Host $http_host;
    }
}

Flask的启动方式

FLASK_APP=src/app.py flask run -h 0.0.0.0 -p 8888

确认版本

$ docker -v
Docker version 20.10.21, build 20.10.21-0ubuntu3
广告
将在 10 秒后关闭
bannerAds