GAE联合身份登录HTTP 204

时间:2013-12-03 13:02:34

标签: wordpress google-app-engine python-2.7 openid

我搜索了网站,但找不到与此情况完全匹配的任何内容。

克利夫的笔记:

尝试使用https://developers.google.com/appengine/docs/python/users/上的示例python代码和自定义OpenID提供程序在GAE上实现联合登录。 GAE返回HTTP 500或HTTP 204,具体取决于服务器设置。管理控制台上的应用程序日志中没有条目。最有可能的问题与XRDS文件和发现过程有关。我很感激有关原因或可能的调试方法的任何建议。提前谢谢。

问题详情:

users.create_login_url()函数的'federated_identity'参数中使用以下提供程序时,代码可以正常工作:

  • https://www.google.com/accounts/o8/id
  • yahoo.com
  • aol.com
  • myopenid.com

尝试使用我们自己的自定义OpenID提供程序时会出现问题。我们在不同主机上的几个Wordpress安装上设置了OpenID插件以进行测试。该插件使用XRDS-Simpledomain.com/?xrds发布XRDS文档。示例文档内容:

<?xml version="1.0" encoding="UTF-8" ?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)" xmlns:simple="http://xrds-simple.net/core/1.0" xmlns:openid="http://openid.net/xmlns/1.0">
<XRD xml:id="main" version="2.0">
    <Type>xri://$xrds*simple</Type>

    <!-- OpenID Consumer Service -->
    <Service priority="10">
        <Type>http://specs.openid.net/auth/2.0/return_to</Type>
        <URI>https://goff.wpengine.com/index.php/openid/consumer</URI>
    </Service>

    <!-- OpenID Provider Service (0) -->
    <Service priority="0">
        <Type>http://specs.openid.net/auth/2.0/server</Type>
        <URI>https://goff.wpengine.com/index.php/openid/server</URI>
        <LocalID>http://specs.openid.net/auth/2.0/identifier_select</LocalID>
    </Service>

    <!-- AtomPub Service -->
    <Service priority="10">
        <Type>http://www.w3.org/2007/app</Type>
        <MediaType>application/atomsvc+xml</MediaType>
        <URI>https://goff.wpengine.com/wp-app.php/service</URI>
    </Service>
</XRD>

我已经验证了OpenID提供程序的工作原理是使用它来登录其他支持OpenID的站点,包括使用OpenID插件和Stackoverflow的其他Wordpress安装。

使用登录链接时http://api.lighthouseuk.net/_ah/login_redir?claimid=https://goff.wpengine.com/?xrds&continue=http://api.lighthouseuk.net/ GAE会在几秒钟后返回HTTP 500错误。我们没有找到任何理由 - 管理控制台中没有日志条目 - 但我怀疑它可能与wpengine.com上的配置有关,而不是返回XRDS文件或缓存不正确的文件。
我们通过在我们的开发服务器上运行相同的设置来半确认这一点,该服务器没有启用缓存。现在,当我们访问登录链接时,GAE会返回HTTP 302响应,然后返回HTTP 204响应:http://www.google.com/gen_204?reason=EmptyURL

据我所知,在请求XRDS文件后,GAE不再向我们的服务器发出请求。这让我相信XRDS文件可能存在问题,但我在文档中找不到有关所需属性的任何细节。

尝试过的事情:

登录其他系统

如果您向XRDS文档中指定的URI发送身份验证请求,则OpenID服务器会通过提示用户登录来正确响应。这再次表明GAE会对XRDS文件产生问题,因为我们的服务器没有发出身份验证请求。当日志中没有记录错误时,我无法弄清楚如何调试它  例如https://goff.wpengine.com/openid/server?openid.ns=http://specs.openid.net/auth/2.0&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.identity=http://specs.openid.net/auth/2.0/identifier_select &openid.return_to=http://api.lighthouseuk.net/checkauth&openid.realm=http://api.lighthouseuk.net/&openid.mode=checkid_setup

SSL

显然,对于生产环境,我们将在Wordpress和GAE上使用SSL,但目前这仅仅是一个概念证明。我相信,默认情况下,cURL会尝试检查SSL证书的有效性,因此我们尝试了各种SSL设置组合,包括根本没有。看似没有效果。

Wordpress永久链接

默认情况下,XRDS文档指向/index.php/openid/server/,我们在Wordpress中尝试了永久链接设置的不同组合,以查看它是否有任何影响。它没有。

网址编码

编码claimid的URL似乎没有效果 - 我们仍然收到HTTP 204响应。

1 个答案:

答案 0 :(得分:0)

放弃一段时间后,我重新审视了这个问题,并设法解决了这个问题。如果其他人面临同样的问题,请回答此问题。最终,这取决于我对安全URL的使用。

TL; DR

这应该是我检查过的第一件事,但请确保您的服务器上有SSL证书,以便可以通过安全URL访问OpenID服务器。如果网址不安全,您将收到来自GAE的HTTP 500错误如果SSL证书未验证(事后看来很明显,但这会让我在另一个测试网站上看到自定义生成的SSL证书) 此外,请确保XRDS文档在<URI>元素中包含所述安全地址。

设置详细信息

  • 使用OpenID插件版本3.3.4
  • 使用XRDS-Simple插件版本1.1
  • Wordpress版本3.8
  • 托管于WPEngine.com
  • 运行gae-样板代码的Google App Engine实例(已启用联合身份)

的修饰

我和fiddler2一起玩,看看我是否可以了解更多关于GAE请求的信息。我将来自WPEngine上的OpenID服务器的访问日志与我可以从fiddler2获取的关于stackexchange OpenID服务器(openid.stackexchange.com)的数据进行了比较。

XRDS-Simple插件

我修改了这个插件,为Wordpress HTTP标头添加了一个额外的过滤器:

add_filter('wp_headers', 'xrds_add_xrds_location');

function xrds_add_xrds_location($headers) {
    error_log('Adding XRDS header', 0);
    $headers['X-XRDS-Location'] = get_bloginfo('url').'/?xrds';
    return $headers;
}

之后我修改了xrds_write()函数,只返回以下xml:

<?xml version="1.0" encoding="UTF-8"?>
            <xrds:XRDS
                xmlns:xrds="xri://$xrds"
                xmlns:openid="http://openid.net/xmlns/1.0"
                xmlns="xri://$xrd*($v*2.0)">
                <XRD>
                    <Service priority="10">
                        <Type>http://specs.openid.net/auth/2.0/server</Type>
                        <Type>http://openid.net/extensions/sreg/1.1</Type>
                        <Type>http://axschema.org/contact/email</Type>



                        <URI>http://goff.wpengine.com/index.php/openid/server</URI>
                    </Service>
                </XRD>
            </xrds:XRDS>

这摆脱了http://www.google.com/gen_204?reason=EmptyURL重定向,只是返回了HTTP 500错误 好奇,我尝试了各种不同的东西来获得GAE的任何响应(记住GAE不会显示/_ah/处理程序中出现的错误。
作为最后的手段,我将<URI>元素修改为https而不是http。这样做了!我已成功重定向到goff.wpengine.com,并被要求验证我是否要登录。兴奋,我点击验证。 PHP Fatal error: Call to a member function needsSigning() on a non-object。球。至少现在我可以从PHP错误日志中找出问题。

OpenID插件

经过一些快速谷歌搜索后,我在Google Code上找到了一个thread的OpenID插件。人们遇到了类似的问题,并且一致认为这是由于插件冲突造成的。来自用户#55的评论infinite.alis提到将依赖方添加到用户的“可信站点”一直解决了问题。瞧,在将地址添加到我的可信站点后,整个身份验证流程都已完成,没有错误!

结论

我还没有做过验尸,以确定XRDS-Simple的哪些变化有所不同。我怀疑只需将XRDS-Simple中的<URI>元素更改为https即可解决问题(我之前使用SSL的测试只关注确保users.create_login_url()函数已通过安全地址,而不是XRDS文件通过安全地址描述了OpenID服务器。可能需要在get_bloginfo('url')函数中使用xrds_write()的过滤器。