3

我正在使用 OpenID 库 LightOpenID 让用户登录到他们最喜欢的提供商并将一些信息传递给我的系统。

使用 LightOpenID,这看起来像:

$openid = new LightOpenID('localhost');
if(!$openid->mode) {
    $openid->identity = 'https://www.google.com/accounts/o8/id';
    $openid->required = array(
        'country' => 'contact/country/home',
        'email' => 'contact/email',
        'firstname' => 'namePerson/first',
        'language' => 'pref/language',
        'lastname' => 'namePerson/last',
    );
    header('Location: ' . $openid->authUrl());
} elseif($openid->mode == 'cancel') {
    echo 'User has canceled authentication!';
} else {
    echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
    echo '<pre>'.print_r($openid->data, true).'</pre>';
}

通过设置该required属性,我可以向 OpenID 提供商(例如 Google)询问一些用户详细信息。如果我的研究是正确的,这就是所谓的“属性交换”

现在,我遇到了一些问题(为了简短起见):

1.只有几个供应商列出了他们支持的属性。我想我在这里遗漏了一些东西,认为提供者列出这些属性是显而易见的。有没有什么方法可以通过协议“发现”这些属性?

2.这是我面临的主要问题。基本上,我请求的信息(属性)在用户成功登录并批准后传递到我的服务器。这很好而且很正常——除非我的系统这样做,否则不会永久存储这些数据。然而,问题是我需要在用户登录后的某个时间获取这些数据。

如果我必须用 Facebook 来做这件事,它会使用$fb->api('/me');. 有趣的是,如果我在用户登录时将用户重定向到登录页面,他会使用我需要的信息重定向到我的网站。但是这个过程需要在服务器上完成,我猜对提供者的简单 CURL 请求不会让我得到这些字段。也许原始登录响应参数中的某些内容可能会有所帮助?

TL:博士;用户登录后如何在没有我这边的持久存储的情况下获取属性交换字段?

PS:我使用会话作为持久存储;现在我只是存储 openid 身份 url,但如果需要,我可以添加更多内容。但是,我无法存储 openid 登录响应给出的所有字段(姓名、姓氏、电子邮件等)。

杂项链接/注释

我必须承认 OpenID 中有很多我不完全理解的东西。因此,我将尝试保留一些可能对未来读者有所帮助的笔记或“事实”。

4

2 回答 2

3

OpenID 不能那样工作,除非它也支持 OpenID+OAuth,在这种情况下,您可能会做与 Facebook 相同的事情;您只需调用他们的 API 以使用您在肯定断言中获得的访问令牌获取用户详细信息。

AX 方案非常灵活;例如,您可以使用两个不同的 URI 请求一个字段;一些供应商将支持axschema和其他schema.openid.net

可以通过两种方式索要电子邮件;只需使用不同的别名包含它,例如:

email1 = http://axschema.org/contact/email
email2 = http://openid.net/schema/contact/internet/email

这样您就不必事先知道提供者支持哪些属性类型。

编辑

为什么所有架构 URI 的结果都是 404?

那是因为它们不需要作为文档实际存在,它只是一个约定。

我认为拥有响应式架构 URL 对规范的实现很重要。如果不是,那么这些 URL 的意义何在?

OpenID 实现者只是无法就一组统一的属性类型达成一致。这不利于采用,可以在此处阅读。

于 2012-10-12T13:53:40.520 回答
0

我不知何故找到了一些关于收集用户信息的信息(登录后,没有持久性)。

似乎最好在这里描述:http: //blogs.gnome.org/jamesh/2007/11/26/openid-ax/

于 2012-10-13T01:19:33.373 回答