2010-03-02 5 views
0

Je reçois une erreur "Aucun point de terminaison trouvé après la découverte de l'identificateur [openid identifier]" lorsque j'appelle la méthode complete() du consommateur. Le plus drôle est que sur les quatre fournisseurs OpenID que j'ai testés, ce comportement est observé uniquement avec LiveJournal. Quelles étapes pouvez-vous suggérer pour enquêter et résoudre le problème?Erreur Python OpenID: aucun point de terminaison correspondant trouvé après la découverte de [uri]

store = FileOpenIDStore("/path/to/store") 

def login(req, uri): 
    req.content_type = "text/html" 
    session = Session.Session(req) 
    consumer = Consumer(session, store) 
    auth = consumer.begin(uri) 
    util.redirect(req, auth.redirectURL("http://example.com", "http://example.com/authtest.py?sid=" + session.id())) 
    return 

def index(req, sid): 
    req.content_type = "text/html" 
    c = Consumer(Session.Session(req, sid), store) 
    args = req.args.split("&") 
    arg_dict = {} 
    for i in range(0, len(args)): 
     x, y = args[i].split("=") 
     arg_dict[x] = unquote(y) 
    v = c.complete(arg_dict, "http://example.com/authtest.py?" + req.args) 
    if v.status == 'failure': 
     return v.message 
    else: 
     return v.status 

Répondre

1

Je ne vois pas d'erreur flagrante dans votre code, mais voici quelques mesures pour enquêter sur:

  • Y at-il sortie de oidutil.log? Il se connecte à stderr par défaut, mais vous pouvez le remplacer pour vous connecter ailleurs si votre serveur web ne vous permet pas de voir stderr.

  • Capturez toutes les demandes/réponses. Vous pouvez utiliser quelque chose comme TamperData pour obtenir la demande/réponse indirecte transmise par le navigateur, et l'alimenter à contrib/openid-parse à partir de la distribution python-openid pour que ce soit plus lisible. L'exemple de consommateur de la distribution source python-openid fonctionne-t-il avec votre identifiant LJ? Si oui, quelles sont les différences de demande/réponse entre l'exemple et votre code?

  • Est-ce que votre identifiant LJ comporte des signes de ponctuation?

  • LJ est-il le seul fournisseur de la version 1.x d'OpenID que vous testez? (Probablement, espérons qu'il n'y en aura pas trop.)

  • Votre analyse des arguments pourrait utiliser urlparse.parse_qs, mais je ne suis pas sûr que ce soit vraiment un problème. (Et parse_qs retours {clés: [liste-des-valeurs]}, alors que Consumer.complete attend. {Clé: une seule valeur}, de sorte que vous devez mapper un à l'autre)

+0

En utilisant oidutil.log je découvert que la bibliothèque openID ne vérifie pas OpenID 1.0, que LJ semble utiliser; il vérifie seulement 1.1 malgré le fait que le code pour le traitement 1.0 semble être là. Enquêter. – dpq

+0

Je l'ai réparé. Selon http://trac.openidenabled.com/trac/ticket/162, dans consumer.py, la ligne 986 doit ressembler à 'except (DiscoveryFailure, TypeURIMismatch):', car la méthode _discoverAndVerify déclenche DiscoveryFailure lorsqu'une incompatibilité se produit. Merci de m'indiquer dans la bonne direction :) – dpq

+0

Huh. cygnus a fermé ce billet en tant que 'workforme'. Et ça marche pour moi aussi. Je me demande ce qui se passe là-bas. – keturn

Questions connexes