python-3.x - 如何在 Apache 中使用 Python3 cgi 进行 Http、Https 基本认证而不是 htpasswd 文件
问题描述
如何在 Apache 中使用 Python3 cgi 进行 Http、Https 基本身份验证而不是 htpasswd 文件?
我正在尝试从数据库而不是 htpasswd 文件中获取我的身份验证信息,但仍然使用 Apache 身份验证基础来询问用户名、密码,我该如何使用 python3 来执行此操作?
解决方案
好的,很长一段时间以来,我一直是用于 Web 编程的 Python3 cgi 的忠实粉丝。随着我在箭袋中的 Python3 cgi 箭头继续增长,1)如何包含外部 python 文件,2)在 Apache 中运行 Python 脚本,如 PHP,3)输出,使用 enc_print() 打印 UTF-8 html
这应该是另一个很好的技术。
这是如何在 Apache 中使用 Python3 cgi 进行 HTTP、HTTPS 基本身份验证。
在 Debian/Ubuntu/Linux Mint 中安装authnz-external Apache 模块:
sudo apt-get install libapache2-mod-authnz-external
二、启用模块
a2enmod authnz_external
然后重启阿帕奇
sudo systemctl restart apache2
这是一个示例脚本,用于测试 Python3 myauth.py 中的凭据
#!/usr/bin/python3
import sys
from html import escape
username = ''
password = ''
args = []
auth = False
for line in sys.stdin:
args.append( escape(line.rstrip()) )
if (len(args) == 2):
username = args[0]
password = args[1]
if (username == 'user1' and password == 'mypassword'):
auth = True
if (auth):
exit(0) # login successful
else:
exit(1) # login fail
基本上,脚本从标准输入读取并检查用户名和密码,然后返回退出状态码;0 表示正常,其他任何值表示不正常。
该脚本需要是可执行的。
chmod +x myauth.py
接下来,配置您的 Apache conf在例如 /etc/apache2/conf.d/authnz_external.conf 中定义一个ExternalAuth指令
# define pyauth for authentication
DefineExternalAuth pyauth pipe /path/to/script/myauth.py
然后在站点的 VirtualHost 块中,您需要提供AuthBasicProvider和AuthExternal指令。例如,要保护您网站上的位置 /secure:
<Location /secure>
AuthType Basic
AuthName "Authentication required"
AuthBasicProvider external
AuthExternal pyauth
Require valid-user
</Location>
使用 Python3 脚本,您可以修改脚本以在 mysql / postgresql(推荐)数据库中查询用户名和密码。
请注意,如果您使用 https 访问您的站点,例如使用 letencrypt ,用户名和密码将安全地发送到 Apache 的基本身份验证和 Python3 脚本进行身份验证。
最后,再次重新启动 Apache 并测试您的配置。
推荐阅读
- django-rest-framework - Django REST Framework ValidationError 总是返回 400
- c# - 协程函数在 WaitForSeconds 处停止
- javascript - 如何将文本写入包含路径的文件?
- javascript - 如何检测 YouTube 已从注入的脚本(使用 chrome 扩展)完成视频播放?
- python - Pandas - 如何根据下一个 10 个单元格的平均值更改单元格
- php - Docker-Compose 使用 PHP (MySQLi) 连接 MySQL 数据库
- android - 拔下 USB 电缆也会断开无线 adb 连接
- c# - WCF - 将布尔值序列化/反序列化为是/否而不是真/假?
- php - CodeIgniter PHP 致命错误:调用未定义的函数 form_open()
- sql - 无法创建表空间