Сообщение в блоге
Просто к вашему сведению Я написал сообщение в блоге, объясняющее все, что я сделал, чтобы встать и уйти: http://www.astokes.org/post/ 2013-07-14-juju-gunicorn-apache-django
У меня развернуты эти службы, и все доступно через https. Однако, когда я пытаюсь аутентифицироваться через launchpad.net, openid происходит 2 вещи.
Сначала адресом обратного вызова является http://10.xxx , когда он должен быть https://10.xxx , а во-вторых, происходит сбой приложения с аутентификацией OpenID ошибка: недопустимый openid.mode '' ", когда он, наконец, возвращается на хост https.
zef-sample-apache2-0: ~ $ cat / etc / apache2 / sites -enabled / 10.0.3.206_https
# Managed by juju
<VirtualHost *:80>
ServerName 10.0.3.206
Redirect permanent / https://10.0.3.206/
</VirtualHost>
<VirtualHost *:443>
ServerName 10.0.3.206
ServerAdmin cts@canonical.com
CustomLog /var/log/cts-custom.log combined
ErrorLog /var/log/cts-error.log
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-cts.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-cts.key
RequestHeader set X-FORWARDED-SSL "on"
RequestHeader set X-FORWARDED_PROTO "https"
ProxyRequests off
ProxyPreserveHost on
<Proxy *>
Order Allow,Deny
Allow from All
</Proxy>
ProxyPass / http://10.0.3.113:8080/
ProxyPassReverse / http://10.0.3.113:8080/
#RewriteEngine on
#RewriteRule ^/(.*)$ http://10.0.3.113:8080/$1 [P,L]
# Alias /favicon.ico /srv/seg-dashboard/segdash/static/favicon.ico
# Alias /robots.txt /srv/seg-dashboard/segdash/static/robots.txt
# Alias /static/admin /var/www/static/admin
# Alias /static/ /srv/seg-dashboard/segdash/static/
</VirtualHost>
Я перебираю все через ssl, поэтому на данный момент я не уверен, является ли это проблемой приложения с моим приложением django, так как я запускаю локальный сервер https и аутентифицируюсь по SSL работает нормально.
Есть идеи?
Вот мой вывод статуса juju
machines:
0:
agent-state: running
dns-name: localhost
instance-id: local
instance-state: running
services:
apache2:
charm: cs:precise/apache2-11
exposed: true
relations:
reverseproxy:
- seg-dashboard
units:
apache2/0:
agent-state: started
machine: 0
open-ports:
- 80/tcp
- 443/tcp
public-address: 10.0.3.206
gunicorn:
charm: cs:precise/gunicorn-7
relations:
wsgi-file:
- seg-dashboard
subordinate: true
subordinate-to:
- seg-dashboard
postgresql:
charm: cs:precise/postgresql-30
exposed: false
relations:
db:
- seg-dashboard
replication:
- postgresql
units:
postgresql/0:
agent-state: started
machine: 0
public-address: 10.0.3.37
rabbitmq-server:
charm: cs:precise/rabbitmq-server-12
exposed: false
relations:
amqp:
- seg-dashboard
cluster:
- rabbitmq-server
units:
rabbitmq-server/0:
agent-state: started
machine: 0
public-address: 10.0.3.144
seg-dashboard:
charm: local:precise/seg-dashboard-1
relations:
amqp:
- rabbitmq-server
db:
- postgresql
website:
- apache2
wsgi:
- gunicorn
units:
seg-dashboard/0:
agent-state: started
machine: 0
public-address: 10.0.3.113
subordinates:
gunicorn/0:
agent-state: started
А вот соответствующая часть в настройке Launchpad Openid (django settings.py)
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
ALLOWED_EXTERNAL_OPENID_REDIRECT_DOMAINS = ['lvh.me', 'localhost', 'canonical.com']
# Add support for django-openid-auth
AUTHENTICATION_BACKENDS = (
'django_openid_auth.auth.OpenIDBackend',
'django.contrib.auth.backends.ModelBackend',
)
OPENID_CREATE_USERS = True
OPENID_UPDATE_DETAILS_FROM_SREG = True
OPENID_SSO_SERVER_URL = 'https://login.launchpad.net/'
OPENID_USE_AS_ADMIN_LOGIN = True
OPENID_LAUNCHPAD_TEAMS_REQUIRED = [
'canonical',
]
OPENID_LAUNCHPAD_STAFF_TEAMS = (
'cool-guys',
)
OPENID_STRICT_USERNAMES = True
OPENID_USE_EMAIL_FOR_USERNAME = True
LOGIN_URL = '/openid/login/'
LOGIN_REDIRECT_URL = '/'
# Login is required for all these patterns
LOGIN_REQUIRED_URLS = (
r'/(.*) Дополнительно:
Я полагаю, что проблема связана с передачей обслуживания от Apache (SSL) к gunicorn (nonSSL), а затем при обращении к launchpad.net URL обратного вызова является сервером Apache (nonSSL). Я пытался использовать что-то вроде django-sslify, чтобы заставить SSL на t На стороне приложения, но кажется, что ProxyPreserveHost не заботится / не проверяет, поступает ли хост с https или http, а только по умолчанию - http.
Подробнее:
Вот заголовки запроса, отправленные на launchpad.net
User-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0
Referer:https://10.0.3.218/openid/login/?next=/
Host:login.launchpad.net
DNT:1
Connection:keep-alive
И вот как выглядят данные формы:
openid_referer:"https://10.0.3.218/openid/login/?next=/"
openid.return_to:http://10.0.3.218/openid/complete/?next=%2F&janrain_nonce=2013-07-13T03%3A35%3A28ZSrfuV5
openid.realm:http://10.0.3.218/
Это использует библиотеку django-openid-auth, и я в настоящее время копаю код в Вы поймете, почему потребитель напрямую устанавливает значение return_to http, когда реферер показывает https?
,
)
# We much except the openid URLs otherwise we go in loops.
LOGIN_REQUIRED_URLS_EXCEPTIONS = (
r'/openid/(.*) Дополнительно:
Я полагаю, что проблема связана с передачей обслуживания от Apache (SSL) к gunicorn (nonSSL), а затем при обращении к launchpad.net URL обратного вызова является сервером Apache (nonSSL). Я пытался использовать что-то вроде django-sslify, чтобы заставить SSL на t На стороне приложения, но кажется, что ProxyPreserveHost не заботится / не проверяет, поступает ли хост с https или http, а только по умолчанию - http.
Подробнее:
Вот заголовки запроса, отправленные на launchpad.net
User-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0
Referer:https://10.0.3.218/openid/login/?next=/
Host:login.launchpad.net
DNT:1
Connection:keep-alive
И вот как выглядят данные формы:
openid_referer:"https://10.0.3.218/openid/login/?next=/"
openid.return_to:http://10.0.3.218/openid/complete/?next=%2F&janrain_nonce=2013-07-13T03%3A35%3A28ZSrfuV5
openid.realm:http://10.0.3.218/
Это использует библиотеку django-openid-auth, и я в настоящее время копаю код в Вы поймете, почему потребитель напрямую устанавливает значение return_to http, когда реферер показывает https?
,
)
Дополнительно:
Я полагаю, что проблема связана с передачей обслуживания от Apache (SSL) к gunicorn (nonSSL), а затем при обращении к launchpad.net URL обратного вызова является сервером Apache (nonSSL). Я пытался использовать что-то вроде django-sslify, чтобы заставить SSL на t На стороне приложения, но кажется, что ProxyPreserveHost не заботится / не проверяет, поступает ли хост с https или http, а только по умолчанию - http.
Подробнее:
Вот заголовки запроса, отправленные на launchpad.net
User-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0
Referer:https://10.0.3.218/openid/login/?next=/
Host:login.launchpad.net
DNT:1
Connection:keep-alive
И вот как выглядят данные формы:
openid_referer:"https://10.0.3.218/openid/login/?next=/"
openid.return_to:http://10.0.3.218/openid/complete/?next=%2F&janrain_nonce=2013-07-13T03%3A35%3A28ZSrfuV5
openid.realm:http://10.0.3.218/
Это использует библиотеку django-openid-auth, и я в настоящее время копаю код в Вы поймете, почему потребитель напрямую устанавливает значение return_to http, когда реферер показывает https?
Я обновил пост, чтобы показать правильную конфигурацию как в Apache vhost, так и в файле django settings.py.
Вы захотите, чтобы заголовок был похож на
RequestHeader set X-FORWARDED_PROTO "https"
И установите следующее в настройках django
SECURE_PROXY_SSL_HEADER = ( 'HTTP_X_FORWADED_PROTO', 'https')
Подробнее об этом можно прочитать здесь:
https://docs.djangoproject.com/en/dev/ref/settings/# станд: установка-SECURE_PROXY_SSL_HEADER