如何在不请求SReg字段的情况下区分/识别具有OpenID的用户?

时间:2010-06-24 21:41:07

标签: php authentication openid janrain

我一直在使用JanRain OpenID PHP库,主要是跟随a tutorial I found on ZendZone

如何区分用户 - 尤其是最终使用相同OpenID网址的Google用户https://www.google.com/accounts/o8/id

基本上,我可以检测到他们有一个OpenID帐户...他们已经成功通过身份验证...但我的应用程序仍然不知道他们是谁;只是他们认证了。

为区分用户,本教程使用“简单注册请求”来请求OpenID提供商的用户电子邮件 - 然后使用电子邮件地址查看这是否为返回用户。

这对我不起作用,apparently won't work with some providers所以当我偶然发现一个函数getDisplayIdentifier时,我很兴奋。

require_once "Auth/OpenID/Consumer.php";
require_once "Auth/OpenID/FileStore.php";
// create file storage area for OpenID data
$store = new Auth_OpenID_FileStore('/wtv');
$consumer = new Auth_OpenID_Consumer($store);
$oid_response = $consumer->complete("http://example.com/oir_return");
if ($oid_response->status == Auth_OpenID_SUCCESS) {
    $hopefullyUniqueUserID = $oid_response->getDisplayIdentifier(); // I assumed this would be a relatively permanent way to identify the user...
                                           // I was wrong.
}

不幸的是,几个小时之后getDisplayIdentifier返回的值会发生变化。

4 个答案:

答案 0 :(得分:5)

略读代码,我认为你需要的是$oid_response->identity_url。对我来说(虽然在DotNetOpenAuth而不是php-openid),它回来了

https://www.google.com/accounts/o8/id?id=AItOawmqjknrgk6f9cNdPIVxW43GewJPa1ZW4GE

来自Google,其中ID部分可以重现并且希望对我来说是独一无二的。但是我没有花几个小时来看看它是否会发生变化,所以如果这是你已经从getDisplayIdentifier那里得到的那么道歉 - 但是略读源它看起来它只是使用了第一部分,但是我不是PHP专家。

答案 1 :(得分:2)

答案 2 :(得分:1)

为什么不简单地使用OpenID URL来识别用户?认为它像电子邮件地址一样独特。

答案 3 :(得分:1)

根据下面的最后一段,您肯定应该使用响应对象的identity_url属性(已授予,这是对Python库的引用,但实现非常类似):

  

显示标识符与声明的标识符相关,但是   两个并不总是相同的。显示标识符就是这样的   用户应该识别他们输入的内容,而不是响应的内容   声明的标识符(在L {identity_url}属性中)可能有额外的   有关更好持久性的信息。

     

网址将被剥离其片段以供显示。 XRIs会   显示人类可读的标识符(i-name)而不是   持久标识符(i-number)。

     

在用户界面中使用显示标识符。使用   L {identity_url}用于查询数据库或授权服务器。

来自python-openid docs