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

Ric*_*uen 5 php openid authentication janrain

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

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

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

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

它对我不起作用,显然不会与某些提供商合作,所以当我偶然发现一个功能时我很兴奋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.
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,经过几个小时后,getDisplayIdentifier变化返回的值.

Rup*_*Rup 5

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

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

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


Ric*_*uen 2

问题是Google 的 OpenID 是每个域唯一的;我心不在焉地在http://www.mysite.com和 之间交替http://mysite.com,导致 OpenID 身份 url 发生变化!