0

PHP已从版本5.2升级到5.3。然后将OpenIdand 库从2.1.2升级到2.2.2。并且还更新Yadis到最新。在升级之前,OpenId登录是有效的。底层CMSDrupal。现在我得到一个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 版本已经升级。我在网上搜索了任何问题并阅读了文档。

我是否错过了任何事情或必须为升级做任何额外的工作?

4

2 回答 2

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 {
        ...
    }
}
于 2013-01-10T05:04:08.437 回答
0

我在 Drupal 6 中使用最新的 php-openid 遇到了同样的问题。我不得不在调用之前去掉q=参数。$_SERVER['QUERY_STRING']getConsumer()

于 2013-02-25T13:52:09.427 回答