【问题标题】:How to use Python3 cgi for Http, Https basic authetication in Apache instead of htpasswd file如何在 Apache 中使用 Python3 cgi 进行 Http、Https 基本身份验证而不是 htpasswd 文件
【发布时间】:2020-12-11 20:27:06
【问题描述】:

如何使用Python3 cgi进行Http,Apache中的Https基本认证而不是htpasswd文件?

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

【问题讨论】:

    标签: python-3.x apache2


    【解决方案1】:

    好的,很长一段时间以来,我一直是用于 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 块中,您需要提供 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 并测试您的配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多