首页 > 解决方案 > 如何在 Apache 中使用 Python3 cgi 进行 Http、Https 基本认证而不是 htpasswd 文件

问题描述

如何在 Apache 中使用 Python3 cgi 进行 Http、Https 基本身份验证而不是 htpasswd 文件?

我正在尝试从数据库而不是 htpasswd 文件中获取我的身份验证信息,但仍然使用 Apache 身份验证基础来询问用户名、密码,我该如何使用 python3 来执行此操作?

标签: python-3.xapache2

解决方案


好的,很长一段时间以来,我一直是用于 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 块中,您需要提供AuthBasicProviderAuthExternal指令。例如,要保护您网站上的位置 /secure:

<Location /secure>
        AuthType Basic
        AuthName "Authentication required"
        AuthBasicProvider external
        AuthExternal pyauth
        Require valid-user
</Location>

使用 Python3 脚本,您可以修改脚本以在 mysql / postgresql(推荐)数据库中查询用户名和密码。

请注意,如果您使用 https 访问您的站点,例如使用 letencrypt ,用户名和密码将安全地发送到 Apache 的基本身份验证和 Python3 脚本进行身份验证。

最后,再次重新启动 Apache 并测试您的配置。


推荐阅读