5

我一直在玩弄 JanRain OpenID PHP 库,主要是跟随我在 ZendZone 上找到的教程

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

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

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

它对我不起作用,显然不适用于某些提供商,所以当我偶然发现一个 function 时我很兴奋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

4 回答 4

5

略读代码,我认为这$oid_response->identity_url是您想要的。对我来说(尽管在 DotNetOpenAuth 不是 php-openid 中)返回为

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

来自 Google,其中 ID 部分是可重现的,希望对我来说是独一无二的。但是我还没有离开几个小时来看看这是否会发生变化,所以如果这是您已经从 getDisplayIdentifier 获得的内容,我们深表歉意 - 但是浏览源代码看起来它只是使用第一部分,但我不是PHP专家。

于 2010-07-01T16:39:56.773 回答
2

问题是Google 的 OpenID 是唯一的 Per-Domain;我一直心不在焉地在 和 之间交替http://www.mysite.comhttp://mysite.com这导致 OpenID 身份 url 发生了变化!

于 2010-07-25T13:42:01.997 回答
1

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

于 2010-07-01T15:31:40.167 回答
1

根据下面的最后一段,您绝对应该使用identity_url响应对象的属性(当然,这是参考 Python 库,但实现非常相似):

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

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

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

来自python-openid 文档

于 2012-09-06T00:56:02.723 回答