我使用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:DR用户在没有持久存储的情况下登录后,我如何获得属性交换字段?
PS:我正在使用会话作为持久存储;现在我只是存储openid标识url,但如果需要,我可以添加更多内容。然而,我无法存储openid登录响应提供的所有字段(姓名、姓氏、电子邮件等)。
其他链接/注释
我必须承认,OpenID中有很多东西我并不完全理解。因此,我会尽量记一些笔记或";事实";这可能会对未来的读者有所帮助。
- OpenID属性列表
- 问题:为什么所有架构URL都会导致404(http://schemas.openid.net/)或奇怪的错误(http://axschema.org)
- 附加问题:我认为具有响应模式URL对规范的实现很重要。如果没有,这样的URL有什么意义
- 一些常见OpenID提供程序URL的列表
OpenID不能以这种方式工作,除非它也支持OpenID+OAuth,在这种情况下,你可能会做与Facebook相同的事情;您只需调用他们的API,就可以使用肯定断言中提供的访问令牌来获取用户详细信息。
AX方案非常灵活;例如,您可以使用两个不同的URI来请求一个字段;一些提供商将支持CCD_ 3和另一个CCD_。
通过两种方式索要电子邮件是可以的;只需使用不同的别名将其包括在内,例如:
email1 = http://axschema.org/contact/email
email2 = http://openid.net/schema/contact/internet/email
这样,您就不必事先知道提供程序支持哪些属性类型。
编辑
为什么所有模式URI的结果都是404?
这是因为它们实际上不需要作为文档存在,这只是一种约定。
我认为具有响应模式URL对规范的实现很重要。如果没有,这样的URL有什么意义?
OpenID的实现者无法就一组统一的属性类型达成一致;这对收养是不利的,可以在这里阅读。
我不知怎么找到了一些关于收集用户信息的信息(登录后,没有持久性)。
这里最好描述一下:http://blogs.gnome.org/jamesh/2007/11/26/openid-ax/