【问题标题】:How to distinguish/identify users with OpenID without requesting SReg fields?如何在不请求 SReg 字段的情况下使用 OpenID 区分/识别用户?
【发布时间】:2010-06-24 21:41:07
【问题描述】:

我一直在玩弄 JanRain OpenID PHP 库,主要关注 a tutorial I found on ZendZone

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

基本上,我可以检测到他们有一个 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 返回的值发生了变化。

【问题讨论】:

  • 请仔细阅读规范。 https://www.google.com/accounts/o8/id 是用户提供的标识符,用户不一定声称他拥有它,其目的可能只是引导用户选择标识符,就像 Google 的情况一样。

标签: php authentication openid janrain


【解决方案1】:

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

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

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

【讨论】:

  • 这和$oid_response->getDisplayIdentifier() 给我的一样……我确实把它放了几个小时,它改变了:'( 不过,我会试试的。
  • 我正在奖励这个答案,但等待接受它;我不知道为什么getDisplayIdentifier()(和identity_url)之前改变了我,因为它似乎不再发生了。
  • 干杯。对不起,我没有一个好的答案。对于 OpenID 2,我确信这些是正确的值(openid.net/specs/…openid.net/specs/openid-authentication-2_0.html#identifying)并且在 1 中被称为类似的值(openid.net/specs/…)。浏览 JanRain 代码,我原以为还有一个单独的“显示 url”返回,这就是我认为混乱的来源,但毕竟这实际上不在规范中。
  • Sorry Rup,但我发现了问题所在,所以我不接受这个并接受了我自己的答案。
  • 没问题 - 我对 Google OpenID 不了解,很高兴学到一些东西!
【解决方案2】:

问题是Google's OpenIDs are Unique Per-Domain;我一直心不在焉地在http://www.mysite.comhttp://mysite.com 之间交替,导致OpenID 身份url 发生变化!

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我认为这也是它的工作原理,但他说他看到所有 Google 用户都来自同一个 OpenID URL。
    • 和我一样,但 Google 帐户的 URL 始终为 https://www.google.com/accounts/o8/id
    • stackoverflow 以某种方式在 url 的末尾获得了 ?id=....。不知道如何。也许带有?id=.. 的完整网址是谷歌给你的?? $oid_response 有 url 属性吗?
    • 糟糕,在我发布之前没有看到你的最后一条评论。是的,我认为您想要的是 OpenID 'claimed_id',它似乎包含 ?id=,我认为它是 $oid_response->identity_url
    【解决方案4】:

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

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

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

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

    来自python-openid docs

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多