2010-06-24 67 views
5

我一直在玩JanRain OpenID PHP库,主要跟随a tutorial I found on ZendZone如何在不请求SReg字段的情况下通过OpenID区分/识别用户?

如何区分用户 - 尤其是Google用户,他们最终都使用相同的OpenID URL 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返回的值发生了变化。

+0

请仔细阅读说明书。 'https:// www.google.com/accounts/o8/id'是用户提供的标识符,用户不一定声称拥有它,其目的可能只是引导用户选择标识符,因为与谷歌案。 – Artefacto 2010-07-03 11:25:01

回答

1

为什么不简单使用OpenID URL来识别用户?考虑它独一无二的电子邮件地址。

+0

我认为这也是它的工作原理,但他说他正在看到来自同一个OpenID URL的所有Google用户。 – Rup 2010-07-01 15:51:54

+0

和我一样,但Google帐户始终拥有“https://www.google.com/accounts/o8/id ”作为其网址。 – 2010-07-01 16:01:33

+0

啊,错过了那部分。 – Echo 2010-07-01 16:25:21

5

跳过代码,我认为它是$oid_response->identity_url,你想要的。对我来说(虽然DotNetOpenAuth不是PHP-的OpenID)是回来为

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

从谷歌,其中ID部分是可重复的,希望唯一给我。然而,我还没有离开它几个小时,看看这是否会改变,所以,如果这是你已经从getDisplayIdentifier已经有 - 但略读源代码看起来它只是使用第一部分,但是我不是PHP专家。

+0

这与'$ oid_response-> getDisplayIdentifier()'给了我什么一样的东西,我确实让它几个小时了,它改变了:'(尽管如此,我会尝试。 – 2010-07-01 17:37:18

+0

啊,好吧 - 对不起。 – Rup 2010-07-01 17:43:21

+0

+ 1 - 在几个小时后检查;似乎并没有改变... – 2010-07-02 03:23:44

1

根据下面的最后一段,你一定要使用响应对象的identity_url属性(当然,这是在参考了Python库,但实现是非常类似):

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

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

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

来自python-openid docs

相关问题