Ошибка обходного пути в OpenID-селекторе (prototype.js версия), которая отключает кнопки входа в Google и Yahoo

#javascript #django #openid #openid-selector

#javascript #django #OpenID #OpenID-селектор

Вопрос:

Я пытаюсь использовать прототипную версию OpenID-селектора, найденную в openid-selector-1.3.zip загружено из Google Code 2011-May-03, с django-OpenID-auth

Я отключил демонстрационный режим в коде javascript.

Комбинация работает с панелью запуска.чистый OpenID, но не с Google или Yahoo.

Когда я нажимаю Google или Yahoo, ничего не происходит! Кнопка для Google или yahoo отображается как утопленная. Вот и все. Также django devserver никогда не показывает сообщение формы при нажатии кнопок Google или Yahoo.

При нажатии AOL в форму добавляется текстовое поле и кнопка отправки …. но этого не происходит при нажатии Google или Yahoo … нет дополнительного поля и нет кнопки входа / отправки.

Я подозреваю ошибку javascript или проблему с присвоением имен или идентификаторов элементам. Я надеюсь, что кто-то, кто делал это раньше, сможет быстро увидеть проблему, посмотрев на то, как настроена форма в шаблоне ниже.

Протестированными браузерами были Firefox 3.6.16 (linux) и google Chrome (linux). Кажется, что они функционируют сопоставимо, оба будут входить в OpenID панели запуска, но ничего не делают, кроме нажатия кнопки идентификатора при нажатии Google или yahoo.

Вот журнал веб-сервера django dev, показывающий, что загружаются все статические фрагменты. Они скопированы из дистрибутива OpenID-селектора на 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 шаблон, поэтому в project/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-селектора, настроенную для 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 now вызывается только при наличии кнопки отправки, на которую нужно нажать. Чтобы сохранить исходный интерфейс без добавления кнопки, я изменил процедуру входа для простых конечных точек для вызова обеих функций на ШАГЕ 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

Комментарии:

1. Если у кого-то есть лучший ответ, я буду искать еще несколько дней … прежде чем принять свой собственный ответ.

2. Эти правки были приняты andriy.gerasika, который поддерживает OpenID-селектор. Смотрите code.google.com/p/openid-selector/issues/detail?id=37amp;can=1