如何在不要求SREG字段的情况下区分/识别OpenID的用户?
-
29-09-2019 - |
题
我一直在与Janrain OpenID PHP图书馆玩耍,主要是 我在Zendzone上找到的教程.
如何区分用户 - 尤其是Google用户,他们最终都使用了相同的OpenID URL, https://www.google.com/accounts/o8/id ?
基本上,我正在发现他们有一个开放式帐户……他们已经成功身份验证了……但是我的应用程序仍然不知道他们是谁。只是他们认证的。
为了区分用户,本教程使用“简单注册请求”来请求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.
}
不幸的是,经过几个小时后,价值返回 getDisplayIdentifier
变化。
解决方案 2
问题是 Google的OpenID是独特的人均;我一直在思想交替 http://www.mysite.com
和 http://mysite.com
, ,这导致OpenID身份URL发生了变化!
其他提示
浏览代码,我认为是 $oid_response->identity_url
你要的那个。对我(虽然在dotnetopenauth而不是php-openid中)回来
https://www.google.com/accounts/o8/id?id=AItOawmqjknrgk6f9cNdPIVxW43GewJPa1ZW4GE
来自Google,ID部分是可重现的,希望我独有。但是,我还没有花几个小时来看看这是否发生了变化,所以很抱歉,这是否是您从GetDisplayIdentifier那里获得的 - 但是浏览源看起来像是使用第一部分,但是我没有PHP专家。
为什么不简单地使用OpenID URL来识别用户?认为它像电子邮件地址一样独特。
根据下面的最后一段,您绝对应该使用 identity_url
响应对象的属性(授予,这是指python库,但实现是 非常 相似的):
显示标识符与声称的标识符有关,但两者并不总是相同的。显示标识符是用户应识别的内容,而响应的标识符(在l {Identity_url}属性中)可能具有额外的信息以更好地持久。
URL将剥离其碎片以显示。 XRIS将显示人类可读的标识符(I-NAME),而不是持久标识符(I-Number)。
使用用户界面中的显示标识符。使用l {Identity_url}查询数据库或授权服务器。
来自 Python-Openid文档.