有没有更好的方法从提供商获取OpenID信息?

8

我对OpenID的逻辑还不太熟悉。我正在使用Cakebaker提供的CakePHP OpenID组件以及JanRain提供的PHP OpenID库。

目前一切都运行得很好,但是我无法找到一种详尽的方法来根据提供商和方法(sreg vs. ax)检索用户信息。所以这就是我想到的解决方法:

if ($axResponse) {
    if (is_array($a = $axResponse->get('http://axschema.org/contact/email'))) {
        $user_record['email'] = $a[0];
        if (is_array($b = $axResponse->get('http://axschema.org/namePerson'))) {
            $user_record['nickname'] = $b[0];
        }
    } else if (is_array($a = $axResponse->get('http://schema.openid.net/contact/email'))) {
        $user_record['email'] = $a[0];
        if (is_array($b = $axResponse->get('http://schema.openid.net/namePerson'))) {
            $user_record['nickname'] = $b[0];
        }
    }
} else if ($sreg) {
    if (isset($sreg['email'])) {
        $user_record['email'] = $sreg['email'];
    }
    if (isset($sreg['nickname'])) {
        $user_record['nickname'] = $sreg['nickname'];
    }
}

尽管我已经成功地使用Google、Yahoo!和AOL的OpenID进行了测试,但我相信如果我尝试使用其他/较小的提供商,我可能会遇到麻烦。有没有更好、更好的方法来实现相同的结果?如果我尝试获取其他可选字段,这似乎特别有缺陷...
2个回答

2
请记住,OpenID是用户身份验证的标准,而不是授权数据访问的标准。当然,您可以使用OpenID获取某些用户信息,但这并不是该协议的主要目的。OAuth是授权的标准,如果您需要获取用户数据,可能需要从那里开始。

我完全同意你的观点,甚至可以关闭这个问题并接受你的答案。幸运的是,自那时以来,事情已经有了很大的发展,OAuth2得到了支持,现在,对于大多数用例,我只会使用它,并放弃OpenID。 - damusnet

0

不幸的是,这对我没有太大帮助,因为一切都已经正常工作了。我更希望找到一种优雅的方式来处理响应,但这个库及其文档并没有涵盖这方面的内容... - damusnet
从理论上讲,你可以直接复制LightOpenID中的get*Attributes()函数,将$this->data替换成$_GET + $_POST - Mewp
我必须说这看起来是一个不错的库,但我希望我能保留我的库,因为它已经花费了我一些时间。此外,我发现你用比JanRain库少得多的代码实现了如此多的功能,这让我感到有些奇怪! - damusnet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接