OpenID登录后获取数据

时间:2012-10-12 13:44:39

标签: php openid lightopenid

我使用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)询问某些用户详细信息。如果我的研究是正确的,这称为&#34;属性交换&#34;

现在,我在这里遇到了问题(为了保持这一点):

1。只有少数左右的提供商会列出他们支持的属性。我想我在这里遗漏了一些东西,认为提供者列出这些属性是显而易见的。不管怎样,有什么方法可以发现&#34;这些属性是通过协议吗?

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

如果我必须使用Facebook执行此操作,则会使用$fb->api('/me');。有趣的是,如果我在登录时将用户重定向到登录页面,他会被重定向到我的网站,并提供我需要的信息。但是这个过程需要在服务器上完成,我想向提供商提出一个简单的CURL请求不会让我获得这些字段。也许原始登录响应参数中的某些内容可能有帮助吗?

TL:DR; 如果用户在没有持久存储空间的情况下登录后,如何获取属性交换字段

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

其他链接/备注

我必须承认OpenID中有很多东西我不完全理解。因此,我会尝试保留一些笔记或事实&#34;这可能有助于未来的读者。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我以某种方式找到了有关收集用户信息的一些信息(登录后,没有持久性)。

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