我正在使用LightOpenID实现一个基于 OpenID 的登录系统。按照文档,我使用该$openid->identity
属性来设置和获取用户提供的身份:
在调用 authUrl() 之前设置,在 validate() 之后获取。
所以我这样做:
<?php
$openid = new OpenID;
if( !$openid->mode ){
if( isset($_POST['openid']) ){
// Auth required
$openid->identity = $_POST['openid'];
header('Location: ' . $this->authUrl());
exit;
}
}elseif( $openid->mode == 'cancel' ){
// Cancelled by user
}else{
if( $this->validate() ){
// Sucess
$user = $openid->identity;
}else{
// Error
}
}
当我使用委托测试系统时(我相信这是技术名称:我在登录框中输入我的域名并通过第三方提供商进行身份验证),结果身份并不总是我最初输入的身份,而且这种行为似乎取决于幕后的提供商。更具体地说,如果我键入http://example.com/
Yahoo 将始终返回我的 Yahoo 用户名https://me.yahoo.com/XXXXXXXXXX#5ab6d
在哪里。XXXXXXXXXX
结果,我无法可靠地识别经常性用户:一旦他们切换提供商,他们就会在我的网站中丢失他们的帐户数据:
["openid_claimed_id"] => string(37) "https://me.yahoo.com/XXXXXXXXXX#5ab6d"
["openid_identity"] => string(31) "https://me.yahoo.com/XXXXXXXXXX"
我的问题:
- 这种行为正确吗?
- 我的代码错了吗?
(如果我误用了任何术语,请纠正我。围绕 OpenID 的一切都趋于过于复杂,尤其是术语。)