将用户名从 apache 基本身份验证传递给 cherrypy

将用户名从 apache 基本身份验证传递给 cherrypy

我需要在我的应用程序的一部分中使用 apache 基本身份验证。我想从 apache 获取经过身份验证的用户名,但似乎找不到在哪里访问它。我可以在 apache 日志中看到用户名,所以我知道它在那里的某个地方。用户通过 apache 进行身份验证后,请求将通过代理发送到 cherrypy 服务器。

这是我的 apache vhost 配置的部分:

<Location /ical>
  AuthType Basic
  AuthBasicProvider ldap
  AuthName "Example Calendar Login"
  AuthLDAPUrl "ldaps://ldap.example.net/ou=People,dc=example,dc=net?uid"
  Require valid-user

  ProxyPass http://localhost:8082/                                                                                                                                                                                                     
  ProxyPassReverse http://localhost:8082/                                                                                                                                                                                              
  SetEnv proxy-nokeepalive 1
</Location>

用户身份验证和代理位工作正常。请求经过身份验证并发送到 cherrypy 后,以下是我在 cherrypy 中拥有的标头:

(Pdb) pp cherrypy.request.headers
{'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
 'Accept-Encoding': 'gzip,deflate',
 'Accept-Language': 'en-us,en;q=0.5',
 'Authorization': 'Basic xxxxxxxxxxx',
 'Connection': 'close',
 'Host': 'sub.example.net',
 'If-None-Match': 'e5b0879ce68fcce5b960ce4281c8d706',
 'Remote-Addr': '10.132.32.86',
 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10',
 'X-Forwarded-For': 'xx.xx.xx.xx, xx.xx.xx.xx',
 'X-Forwarded-Host': 'sub.example.net, sub.example.net',
 'X-Forwarded-Server': 'sub.example.net, sub'}

有人能帮助我从 apache basic auth 访问用户名吗?

答案1

我已经添加了一个标头来传递基于 apache 的经过身份验证的用户。

RewriteEngine On
RewriteCond %{REMOTE_USER} ^(.*)$
RewriteRule ^(.*)$ - [E=R_U:%1]
RequestHeader set X-Remote-User %{R_U}e

答案2

您的 cherrypy 应用程序正在接收基本身份验证信息,因为我们在标题中看到了这些信息:

'Authorization': 'Basic xxxxxxxxxxxxxxxxxxxxxx==',

你只需要:

  1. 解码 Base64 字符串 'xxxxxxxxxxxxxxxxxxxxxx==',然后
  2. 从解码的用户名:密码字符串中提取用户名。

由于这不是 stackoverflow ;),我不会费心给出上述内容的确切 Python 实现,但它应该可以帮助您入门。维基百科关于基本访问身份验证的条目内容很丰富,包含各种语言的代码片段。

(关于这个问题的安全提示:如果你使用了真实的用户名/密码在生成问题中包含的标题时,请注意,您已在上面的“授权”标题的文本中向世界透露了它,因为任何想要的人都可以轻松地对其进行解码!)

编辑:我已将授权字符串用‘x’删除。

相关内容