使用具有委派的OpenID时,Yahoo会返回不同的身份URL

时间:2011-11-18 10:58:33

标签: php openid lightopenid

我正在使用LightOpenID实现基于OpenID的登录系统。在documentation之后,我使用$openid->identity属性来设置并获取用户提供的标识:

  

在调用authUrl()之前设置它,并在validate()之后获取。

所以我这样做:

<?php

$openid = new OpenID;

if( !$openid->mode ){
    if( isset($_POST['openid']) ){
        // Auth required
        $openid->identity = $_POST['openid'];
        header('Location: ' . $this->authUrl());
        exit;
    }

}elseif( $openid->mode == 'cancel' ){
    // Cancelled by user

}else{
    if( $this->validate() ){
        // Sucess
        $user = $openid->identity;
    }else{
        // Error
    }
}

当我使用委派测试系统时(我相信这是技术名称:我在登录框中输入我的域名并通过第三方提供商进行身份验证)所得到的身份并非总是如此我最初输入的那个,这种行为似乎取决于幕后的提供者。更具体地说,如果我输入http://example.com/,Yahoo将始终返回https://me.yahoo.com/XXXXXXXXXX#5ab6d,其中XXXXXXXXXX是我的Yahoo用户名。因此,我无法可靠地识别经常性用户:一旦他们切换提供商,他们就会在我的网站中丢失他们的帐户数据:

["openid_claimed_id"] => string(37) "https://me.yahoo.com/XXXXXXXXXX#5ab6d"
["openid_identity"] => string(31) "https://me.yahoo.com/XXXXXXXXXX"

我的问题:

  • 这种行为是否正确?
  • 我的代码错了吗?

(如果我滥用任何术语,请纠正我。围绕OpenID的所有内容都会过度复杂,尤其是术语。)

1 个答案:

答案 0 :(得分:2)

据我所知,提供商的行为不正确。

雅虎(顺便说一句,AOL)就是这么做的。解决此问题的唯一方法是开始使用其他提供程序。

至于你的第二个问题,你的代码是正确的。但请记住,身份验证状态不会自动记住,您必须自己将其存储在会话中(当然,如果您希望它在请求之间保留)。