我使用OpenID库LightOpenID让用户登录到他们最喜欢的提供者并将一些信息传递给我的系统。OpenID在登录后获取数据
随着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提供商(如谷歌)的一些用户详细信息。如果我的研究是正确的,则称为“属性交换”。
现在,在这里我有一些问题(把这个短):
一对夫妇只左右的供应商列出他们所支持的属性。我想我在这里错过了一些东西,认为供应商列出这些属性显然是显而易见的。无论如何,有没有办法通过协议“发现”这些属性?
2.这是我面临的主要问题。基本上,我请求的信息(属性)在用户成功登录和批准后传递到我的服务器。这很好,很正常 - 除非我的系统执行此操作,否则不会持续存储此数据。但问题是,我需要得到这个数据一段时间之后,用户没有登录。
如果我不得不与Facebook要做到这一点,它会使用$fb->api('/me');
。有趣的是,如果我在用户登录时将用户重定向到登录页面,他会将我需要的信息重定向到我的网站。但是这个过程需要在服务器上完成,我想对提供者的简单CURL请求不会让我看到这些字段。也许来自原始登录响应参数的东西可能有帮助?
TL:DR;如何获得属性交换字段用户是否从我身边登录而没有持久存储?
PS:我使用会话作为持久存储;现在我只是存储openid身份网址,但如果需要,我可以添加更多内容。但是,我不能存储由openid登录响应(名称,姓氏,电子邮件等)给出的所有字段。
其它链接/ Notes的
我必须承认有在OpenID的很多东西我不完全了解。因此,我会尽量保留一些可能有助于未来读者的笔记或“事实”。
- List of OpenID attributes
- 问题:为什么所有模式的URL导致404(http://schemas.openid.net/)或奇怪的错误(http://axschema.org)?
- 其他问题:我认为响应模式URL对规范的实现很重要。如果不是,这样的网址有什么意义?
- List of some common OpenID provider URLs
杰克,我明白的前两段,但我得到了与第三一个困惑。我如何“知道”,例如,谷歌支持'http:// axschema.org/namePerson/first'而无需事先做出请求? – Christian
@Christian你不......好吧,我确定他们的文件;但没关系,你只要求两种方式使用同一个字段(使用两种URI方案) - 如果它们都不支持,你可以通过查看断言来知道一个或两个字段。 –
所以你说我应该同时要求同一个属性的两个URL?另外,你能看到我编辑的问题吗? – Christian