2011-05-03 5 views
1

J'essaie d'utiliser la version prototype du sélecteur openid trouvé dans openid-selector-1.3.zip, téléchargé depuis Google Code 2011 -May-03, avec django-openid-authBogue de contournement dans openid-selector (version prototype.js) qui désactive les boutons de connexion Google et Yahoo

J'ai désactivé le mode démo dans le code javascript.

La combinaison fonctionne avec un launchpad.net openid mais pas avec Google ou Yahoo.

Lorsque je clique sur Google ou Yahoo, rien ne se passe! Le bouton pour google ou yahoo s'affiche comme enfoncé. C'est tout. Aussi le devserver django ne montre jamais un formulaire POST en cliquant sur les boutons Google ou Yahoo. Lorsque vous appuyez sur AOL, un champ de texte et un bouton d'envoi sont ajoutés au formulaire .... mais cela ne se produit pas lorsque vous appuyez sur Google ou Yahoo ... aucun champ supplémentaire et aucun bouton de connexion/envoi.

Je suspecte une erreur javascript ou un problème avec la dénomination ou l'id-ing des éléments. Mon espoir est que quelqu'un qui a fait cela avant peut rapidement voir le problème en regardant comment le formulaire est mis en place dans le modèle ci-dessous.

Les navigateurs testés étaient Firefox 3.6.16 (linux) et google chrome (linux). Ils semblent fonctionner de manière comparable, les deux vont se connecter au launchpad openid mais ne font rien au-delà de l'enfoncement du bouton identifiant lorsque google ou yahoo est cliqué.

Voici le journal du serveur web django dev, montrant que toutes les pièces statiques sont chargées. Ceux-ci sont copiés à partir de la distribution openid-selector sur code.google.com avec seulement quelques changements mineurs (désactiver la démo, définir le répertoire de l'image). Ceci est de montrer que les bons morceaux sont livrés (bien sûr, ceux-ci pourraient également être mises en cache si l'absence ne serait pas concluante ...)

[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 fournit seulement une entrée de texte/bouton Envoyer forme à titre d'exemple. Mais il prend en charge un modèle login.html, donc dans le projet/templates/openid/login.html je ce modèle, qui est rendu:

<?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> 

Toute idée de ce que le problème pourrait être? Je pensais que cela pourrait impliquer la dénomination des éléments de formulaire, mais je pensais que je maintenais les identifiants originaux. J'ai changé le nom du formulaire du champ de texte.

Cela semble être un problème résolu pour que je puisse simplement télécharger une version d'openid-selector personnalisée pour django. Mais je ne pouvais pas en trouver un. Y a-t-il une meilleure façon de procéder à cette intégration?

Répondre

0

j'ai pu corriger le Google/bouton Yahoo problème d'inactivité dans OpenID prototype.js en changeant la présentation de la gestion des formulaires juste un peu, comme suit:

ÉTAPE 1: Dans init(), openid-prototype .js ligne environ 47, changer

$('openid_form').submit=this.submit

à

$('openid_form').onsubmit=this.submit

[Le réglage précédent de l'ÉTAPE 1 semblait provoquer un comportement bizarre lors d'un pas simple. Cependant, la fonction this.submit === openid.submit n'est désormais appelée que lorsqu'il y a un bouton submit à cliquer.Pour préserver l'interface originale sans l'ajout d'un bouton, j'ai changé la procédure de signin pour les points finaux simples pour appeler les deux fonctions dans STEP 2]

ÉTAPE 2: Dans signin(), prototype.js-ligne OpenID environ 95, changer

if (!onload) {$('openid_form').submit();}

à

if (!onload) {if (this.submit()){$('openid_form').submit();}}}

Après avoir fait ces deux changements, il a travaillé. Je pourrais cliquer sur Google ou Yahoo et le formulaire openid serait POSTé à la vue de gestion de formulaire dans django-openid-auth

+0

Si quelqu'un a une meilleure réponse, je regarderai à nouveau pendant quelques jours ... avant d'accepter le mien répondre. – Paul

+0

Ces modifications ont été acceptées par andriy.gerasika, qui maintient openid-selector. Voir http://code.google.com/p/openid-selector/issues/detail?id=37&can=1 – Paul

Questions connexes