我已经设置了一个 Apache2 服务器作为反向代理,它从我的网络中的虚拟机检索多个服务。我正在尝试设置基本身份验证以限制某些用户的某些服务,使用 mysql 数据库来存储用户和密码。
我确信 Apache2 正在连接到数据库,并在我尝试使用 http 身份验证登录时检索适当的用户名,因为我检查了 mysql 日志:
2017-12-12T16:14:20.338976Z 2542 准备从 testTable 中选择密码,其中用户名=?
2017-12-12T16:14:29.611520Z 2531 执行 SELECT 密码 FROM testTable WHERE username='testuser'
但是,我的身份验证总是因密码不匹配而被拒绝。
[2017 年 12 月 12 日星期二 10:14:29.612762] [auth_basic:error] [pid 2729] [客户端 192.168.1.194:56047] AH01617:用户 testuser:“/protected”身份验证失败:密码不匹配,引荐来源:http: //192.168.1.217/landPage.php
<Location "/protected">
AuthName "Authentication"
AuthType Basic
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT password FROM testTable WHERE username=%s"
</Location>
为时已晚,但可能会对某人有所帮助。我在 Ubuntu 上使用
sqlite3
时遇到了同样的问题。首先确保您的密码在 Ubuntu 上按照此编码 https://httpd.apache.org/docs/2.4/misc/password_cryptions.html
我首先使用此 Apache 页面提供的 Python 代码对我的密码进行 SHA1 编码https://httpd.apache.org/docs/2.4/misc/password_cryptions.html我在 Ubuntu 终端执行此操作并收到了此信息
>>> "{SHA}" + format(base64.b64encode(hashlib.sha1('1234567'.encode('utf-8')).digest()));
Result "{SHA}b'IOq+XWSw4hZ5boNPUtYf0LcDMvw='"
然后,我使用 Apache httpd pack 中的
htpasswd
SHA1 编码相同的字符串。它给出了几乎相同的结果
/usr/local/apache2/bin$ ./htpasswd -nbs testuser 1234567
testuser:{SHA}IOq+XWSw4hZ5boNPUtYf0LcDMvw=
你看到区别了吗?来自终端的 Python 结果前面加上单引号,b 后面加上单引号。所以在Python中删除它或者使用
htpasswd