我一直在使用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
返回的值会发生变化。
答案 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}用于查询数据库或授权服务器。