我搜索了网站,但找不到与此情况完全匹配的任何内容。
尝试使用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
尝试使用我们自己的自定义OpenID提供程序时会出现问题。我们在不同主机上的几个Wordpress安装上设置了OpenID插件以进行测试。该插件使用XRDS-Simple在domain.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
显然,对于生产环境,我们将在Wordpress和GAE上使用SSL,但目前这仅仅是一个概念证明。我相信,默认情况下,cURL会尝试检查SSL证书的有效性,因此我们尝试了各种SSL设置组合,包括根本没有。看似没有效果。
默认情况下,XRDS文档指向/index.php/openid/server/,我们在Wordpress中尝试了永久链接设置的不同组合,以查看它是否有任何影响。它没有。
编码claimid的URL似乎没有效果 - 我们仍然收到HTTP 204响应。
答案 0 :(得分:0)
放弃一段时间后,我重新审视了这个问题,并设法解决了这个问题。如果其他人面临同样的问题,请回答此问题。最终,这取决于我对安全URL的使用。
这应该是我检查过的第一件事,但请确保您的服务器上有SSL证书,以便可以通过安全URL访问OpenID服务器。如果网址不安全,您将收到来自GAE的HTTP 500
错误或如果SSL证书未验证(事后看来很明显,但这会让我在另一个测试网站上看到自定义生成的SSL证书)
此外,请确保XRDS文档在<URI>
元素中包含所述安全地址。
我和fiddler2一起玩,看看我是否可以了解更多关于GAE请求的信息。我将来自WPEngine上的OpenID服务器的访问日志与我可以从fiddler2获取的关于stackexchange OpenID服务器(openid.stackexchange.com)的数据进行了比较。
我修改了这个插件,为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错误日志中找出问题。
经过一些快速谷歌搜索后,我在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()
的过滤器。