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
有两个容器在奔跑。
-
- nginx_auth_sample_nginx_1
-
- 该处运行着Nginx。
-
- 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
使用浏览器访问
请清除浏览记录并进行测试。
在下面的URL中,根据您是否登录,显示内容会有所不同。
http://localhost:8000/private/aaa/
http://localhost:8000/private/bbb/
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