2012-10-12 53 views
3

我使用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的很多东西我不完全了解。因此,我会尽量保留一些可能有助于未来读者的笔记或“事实”。

回答

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对规范的实现很重要。如果不是,这样的网址有什么意义?

OpenID的实施者无法就统一的一组属性类型达成一致;这对于采用是不利的,因为可以读取here

+0

杰克,我明白的前两段,但我得到了与第三一个困惑。我如何“知道”,例如,谷歌支持'http:// axschema.org/namePerson/first'而无需事先做出请求? – Christian

+0

@Christian你不......好吧,我确定他们的文件;但没关系,你只要求两种方式使用同一个字段(使用两种URI方案) - 如果它们都不支持,你可以通过查看断言来知道一个或两个字段。 –

+0

所以你说我应该同时要求同一个属性的两个URL?另外,你能看到我编辑的问题吗? – Christian