Обходная ошибка в openid-selector (версия prototype.js), которая отключает кнопки входа в Google и Yahoo
Я пытаюсь использовать прототип версии селектора openid, найденной в openid-selector-1.3.zip, загруженной из Google Code 2011-May-03, с django-openid-auth
Я отключил демонстрационный режим в коде JavaScript.
Комбинация работает с openid launchpad.net, но не с Google или Yahoo.
Когда я нажимаю Google или Yahoo, ничего не происходит! Кнопка для Google или Yahoo отображается как затонувший. Вот и все. Кроме того, django devserver никогда не показывает форму POST при нажатии кнопок Google или Yahoo.
При нажатии AOL в форму добавляется текстовое поле и кнопка отправки.... но этого не происходит при нажатии Google или Yahoo... нет лишних полей и кнопки входа / отправки.
Я подозреваю, что произошла ошибка в JavaScript или проблема с именованием или идентификацией элементов. Я надеюсь, что кто-то, кто делал это раньше, может быстро увидеть проблему, глядя на то, как настроена форма в шаблоне ниже.
Были протестированы следующие браузеры: Firefox 3.6.16 (Linux) и Google Chrome (Linux). Похоже, что они функционируют одинаково, оба войдут в openid панели запуска, но ничего не сделают, кроме нажатия кнопки идентификатора при нажатии на Google или Yahoo.
Вот журнал веб-сервера django dev, показывающий, что все статические части загружаются. Они скопированы из дистрибутива openid-selector на code.google.com только с несколькими незначительными изменениями (отключите демонстрацию, установите каталог с изображениями). Это должно показать, что правильные части доставляются (конечно, они также могут быть кэшированы, поэтому отсутствие не будет окончательным...)
[03/May/2011 04:58:53] "GET / HTTP/1.1" 200 115
[03/May/2011 04:58:56] "GET /openid/login HTTP/1.1" 301 0
[03/May/2011 04:58:56] "GET /openid/login/ HTTP/1.1" 200 2182
[03/May/2011 04:58:56] "GET /static/css/openid.css HTTP/1.1" 200 1007
[03/May/2011 04:58:56] "GET /static/js/prototype.js HTTP/1.1" 200 162353
[03/May/2011 04:58:56] "GET /static/js/openid-prototype.js HTTP/1.1" 200 5931
[03/May/2011 04:58:56] "GET /static/js/openid-en.js HTTP/1.1" 200 2302
[03/May/2011 04:58:56] "GET /static/images/openid-providers-en.png HTTP/1.1" 200 15894
В качестве примера django-openid-auth предоставляет только форму кнопки ввода / отправки текста. Но он поддерживает шаблон login.html, поэтому в проекте / templates / openid / login.html у меня есть этот шаблон, который отображается:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Please Login</title>
<!-- Simple OpenID Selector -->
<link type="text/css" rel="stylesheet" href="/static/css/openid.css" />
<script type="text/javascript" src="/static/js/prototype.js"></script>
<script type="text/javascript" src="/static/js/openid-prototype.js"></script>
<script type="text/javascript" src="/static/js/openid-en.js"></script>
<script type="text/javascript">
document.observe('dom:loaded', function() {
openid.init('openid_identifier');
});
</script>
<!-- /Simple OpenID Selector -->
<style type="text/css">
/* Basic page formatting */
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
</style>
</head>
<body>
<h2>Please Select Your Provider for Login</h2>
<p>Select your identity provider from the list below. You will be sent there to log in and returned here as an identified user. There are no registration forms for this website or extra passwords to remember. </p>
{% if form.errors %}
<p class="errors">Please correct errors below:<br />
{% if form.openid_identifier.errors %}
<span class="error">{{ form.openid_identifier.errors|join:", " }}</span>
{% endif %}
{% if form.next.errors %}
<span class="error">{{ form.next.errors|join:", " }}</span>
{% endif %}
</p>
{% endif %}
<br/>
<!-- Simple OpenID Selector -->
<form action="{{ action }}" name="fopenid" method="post" id="openid_form">
{% csrf_token %}
<input type="hidden" name="action" value="verify" />
<fieldset>
<legend>Sign-in or Create New Account</legend>
<div id="openid_choice">
<p>Please click your account provider:</p>
<div id="openid_btns"></div>
</div>
<div id="openid_input_area">
<input id="openid_identifier" name="openid_identifier" type="text" maxlength="255" value="http://" />
<input id="openid_submit" type="submit" name="bsignin" value="Sign-In" />
</div>
<noscript>
<p>You need javascript and cookies enabled and an OpenID to use this site. You are using a browser that does not support javascript or has javascript turned off.</p>
</noscript>
</fieldset>
</form>
<!-- /Simple OpenID Selector -->
</body>
</html>
Есть идеи, в чем может быть проблема? Я думал, что это может включать в себя именование элементов формы, но я думал, что сохранил оригинальные идентификаторы. Я изменил название формы текстового поля.
Кажется, что это должно быть решенной проблемой, чтобы я мог просто скачать версию openid-selector, настроенную для django. Но я не мог найти один. Есть ли лучший способ обойти эту интеграцию?
1 ответ
Мне удалось исправить проблему неактивности кнопки Google/Yahoo в openid-prototype.js, немного изменив обработку отправки формы следующим образом:
ШАГ 1. В init() openid-prototype.js приблизительно строка 47, измените
$('openid_form').submit=this.submit
в
$('openid_form').onsubmit=this.submit
[Предыдущая настройка в ШАГЕ 1, казалось, вызывала странное поведение при одиночном шаге. Однако функция this.submit === openid.submit теперь вызывается только тогда, когда есть кнопка отправки, на которую можно нажать. Чтобы сохранить оригинальный интерфейс без добавления кнопки, я изменил процедуру входа для простых конечных точек для вызова обеих функций в ШАГЕ 2]
ШАГ 2. В signin() openid-prototype.js приблизительно строка 95, измените
if (!onload) {$('openid_form').submit();}
в
if (!onload) {if (this.submit()){$('openid_form').submit();}}}
После внесения этих двух изменений все заработало. Я могу нажать на Google или Yahoo, и форма openid будет помещена в представление обработки формы в django-openid-auth