【发布时间】:2020-12-11 20:27:06
【问题描述】:
如何使用Python3 cgi进行Http,Apache中的Https基本认证而不是htpasswd文件?
我正在尝试从数据库而不是 htpasswd 文件中获取我的身份验证信息,但仍然使用 Apache 身份验证基础来询问用户名、密码,我该如何使用 python3 来执行此操作?
【问题讨论】:
标签: python-3.x apache2
如何使用Python3 cgi进行Http,Apache中的Https基本认证而不是htpasswd文件?
我正在尝试从数据库而不是 htpasswd 文件中获取我的身份验证信息,但仍然使用 Apache 身份验证基础来询问用户名、密码,我该如何使用 python3 来执行此操作?
【问题讨论】:
标签: python-3.x apache2
好的,很长一段时间以来,我一直是用于 Web 编程的 Python3 cgi 的忠实粉丝。随着我在箭袋中的 Python3 cgi 箭头继续增长,1)How to include external python file 和 2)Running Python scripts like PHP in Apache 和 3)Output, print UTF-8 html with enc_print()
这应该是另一种好用的技术。
这是如何使用 Python3 cgi 在 Apache 中进行 HTTP、HTTPS 基本身份验证。
在 Debian/Ubuntu/Linux Mint 中安装 authnz-external Apache 模块:
sudo apt-get install libapache2-mod-authnz-external
二、启用模块
a2enmod authnz_external
然后重启Apache
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 并测试您的配置。
【讨论】: