我正在使用 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 中有很多我不完全理解的东西。因此,我将尝试保留一些可能对未来读者有所帮助的笔记或“事实”。
- OpenID 属性列表
- 问题:为什么所有架构 URL 都会导致 404 ( http://schemas.openid.net/ ) 或奇怪的错误 ( http://axschema.org )?
- 附加问题:我认为响应式架构 URL 对规范的实现很重要。如果不是,那么这些 URL 的意义何在?
- 一些常见的 OpenID 提供程序 URL 列表