Передать имя пользователя из Apache Basic Authentication к 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?
2 ответа
Я добавил заголовок для прохождения аутентифицированного пользователя на основе Apache.
RewriteEngine On
RewriteCond %{REMOTE_USER} ^(.*)$
RewriteRule ^(.*)$ - [E=R_U:%1]
RequestHeader set X-Remote-User %{R_U}e
Ваше приложение cherrypy получает информацию об базовой аутентификации, поскольку мы видим это в заголовках:
'Authorization': 'Basic xxxxxxxxxxxxxxxxxxxxxx==',
Вам просто нужно:
- декодировать строку Base64 'xxxxxxxxxxxxxxxxxxxxxx==' и
- извлечь имя пользователя из расшифрованного имени пользователя: строка пароля.
Так как это не переполнение стека ;)
Я не стану давать точную реализацию вышеизложенного на python, но это поможет вам начать. Запись в Википедии о базовой аутентификации доступа довольно информативна и содержит фрагменты кода на разных языках.
(Просто примечание по безопасности по этому вопросу: если вы использовали реальное имя пользователя / пароль при создании заголовков, включенных в ваш вопрос, имейте в виду, что вы раскрыли его миру в тексте заголовка "Авторизация" выше, поскольку любой, кто хочет его можно тривиально расшифровать!)
Редактировать: у меня есть 'x'-черкнутая строка авторизации.