Python OpenID错误:发现[uri]后未找到匹配的端点

Python OpenID错误:发现[uri]后未找到匹配的端点,openid,mod-python,Openid,Mod Python,当我调用使用者的complete()方法时,我得到一个“在发现[openid identifier]后找不到匹配的端点”错误 有趣的是,在我测试过的四个OpenID提供者中,只有LiveJournal观察到了这种行为。您可以建议采取哪些步骤来调查和解决问题 store = FileOpenIDStore("/path/to/store") def login(req, uri): req.content_type = "text/html" session = Session.

当我调用使用者的complete()方法时,我得到一个“在发现[openid identifier]后找不到匹配的端点”错误

有趣的是,在我测试过的四个OpenID提供者中,只有LiveJournal观察到了这种行为。您可以建议采取哪些步骤来调查和解决问题

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

我看不到您的代码中有任何明显的错误,但以下是一些需要调查的步骤:

  • 是否有来自
    oidutil.log
    的任何输出?默认情况下,它会登录到stderr,但是如果您的web服务器不允许您查看stderr,您可以覆盖它以登录到其他地方

  • 捕获所有请求/响应。您可以使用类似这样的方法获取通过浏览器传递的间接请求/响应,并将其从python openid发行版馈送到
    contrib/openid parse
    ,使其更具可读性

  • python openid源代码发行版中的示例使用者是否与您的LJ标识符一起工作?如果是这样,那么示例和代码之间的请求/响应有什么区别

  • 您的LJ标识符中有标点符号吗

  • LJ是您测试的唯一OpenID版本1.x提供程序吗?(可能吧。希望剩下的不会太多。)

  • 您的参数解析可以使用
    urlparse.parseqs
    ,但我不确定这是否真的是个问题。(和parse_qs返回{key:[值列表]},而
    Consumer.complete
    需要{key:single value},因此必须将一个值映射到另一个值。)


使用oidutil.log我发现openID库没有检查OpenID1.0,LJ似乎在使用它;它只检查1.1,尽管处理1.0的代码似乎在那里。调查,我搞定了。根据,在consumer.py中,第986行应该看起来像
,除了(DiscoveryFailure,typeurismatch):
,因为发生不匹配时_discoverAndVerify方法会引发DiscoveryFailure。谢谢你给我指出了正确的方向:)嗯。天鹅座以
worksforme
的身份关闭了那张罚单。这对我也有用。我不知道那里发生了什么事。