我已将PHP
从版本 5.2 升级为 5.3 。然后将OpenId
和库从 2.1.2 升级到 2.2.2 。并将Yadis
更新为最新版本。在升级之前,OpenId
登录正在运行。基础 CMS 是 Drupal 。
现在我在返回的终点得到Auth_OpenID_FailureResponse
。
我的代码如下所示:
include 'common.php';
$consumer = getConsumer();
$response = $consumer->complete( BASE_URL . '/google/return' . urlencode($ext_param));
if( $response->status == Auth_OpenID_SUCCESS ){
echo "Successful status";
} else {
print_r( $response );
}
跟踪如下所示(删除了原始域名):
Auth_OpenID_FailureResponse Object (
[status] => failure
[endpoint] =>
[identity_url] =>
[message] => return_to does not match return URL. Expected http://xxx.xxxxx.com/ \
openid/google/return?from=accounts.google.com&janrain_nonce= \
2012-10-16T03%3A54%3A37Zudn8eJ, got http://xxx.xxxxx.com/openid/google/return? \
from=accounts.google.com&janrain_nonce=2012-10-16T03%3A54%3A37Zudn8eJ
[contact] =>
[reference] =>
)
这对我来说很奇怪,因为代码未被修改但是库和PHP版本已升级。我在网上搜索任何问题并阅读文档。
我是否遗漏了任何东西或者必须为升级做额外的工作?
答案 0 :(得分:0)
我能够自己解决这个问题。根本原因是 Drupal 当前路径变量$_GET['q']
,因此它从$_GET
参数数组中删除,这使得OpenId返回端点进程成功。
OpenID返回端点中的代码:
function handle_openid_return () {
// unset the parameter 'q' from $_GET
unset($_GET['q']);
// Include
include 'common.php';
// Get the OpenID consumer
$consumer = getConsumer();
$response = $consumer->complete( BASE_URL . '/google/return' . urlencode($ext_param));
// Check the status of the $response object, for successful OpenID call
if ($response->status == Auth_OpenID_SUCCESS) {
...
} else {
...
}
}
答案 1 :(得分:0)
我在Drupal 6中使用最新的php-openid遇到了同样的问题。在调用q=
之前,我必须从$_SERVER['QUERY_STRING']
中删除getConsumer()
参数。