Home >Backend Development >PHP Tutorial >OpenID with PHP
AVBlog2.0开发手记之一
打酱油先OpenID已经不算是新鲜事物了,不过至今仍然是处于叫好不叫座的尴尬状态。推广的策略是一方面,从用户体验的角度来看,登录过程中会有可能跳转到OpenID网站,这是对已经习惯了普通注册登录流程的用户一个极大的考验。所以像Facebook Connect这样更简洁的应用反而更容易获得市场。也许OpenID想要获得广泛应用还需要不少改进之处,但OpenID的理念,毫无疑问会在未来大放异彩。
不过这些和本次的Blog并无太大关系,我只是出来打酱油的:P
想要让自己的网站支持OpenID,门槛并不算高,以下以PHP为例,记述PHP环境下OpenID登录过程的开发。
准备工作OpenID的通讯过程已经有很多库封装好了,在OpenID Wiki里可以看到不少PHP类库,本次我们选择JanRain的OpenID Enabled。
最新的版本是Version 2.1.2,基于OpenID2.0协议,下载到本地后直接运行examples文件夹里的detect.php,可以根据提示调整开发环境,最低限度需要PHP的PEAR支持。具体情况可以根据提示灵活处理,环境调整的工作这里一笔带过。
运行Demo客户端登录,已经有现成的Demo可供参考,运行examples/consumer/index.php,输入我们想要验证的OpenID然后提交,Win32环境下会很不幸的出现无法创建/tmp/_php_consumer_test的错误。这是为了保存登录过程中的临时文件,修改examples/consumer/common.php第53行,改为相对目录。
$store_path = "./_php_consumer_test";
重新运行Demo,仍然报错
Fatal error: Define Auth_OpenID_RAND_SOURCE as null to continue with an insecure random number generator.
在Auth\OpenID\CryptUtil.php的第23行,这里定义了Auth_OpenID_RAND_SOURCE会通过一个特定文件用来生成随机数,这里可以指定本机的一个文件,也可以直接定义为null
define('Auth_OpenID_RAND_SOURCE', null);
至此如果运行环境没有问题的话,客户端登录的Demo已经可以成功运行了。
数据库模式运行上面的例子采用了文件的方式保存登录过程中的临时文件,OpenID Enabled同时也提供了数据库方式的存储,数据库连接部分是基于PEAR的DB类实现。以Mysql为例,修改examples/consumer/index.php的getStore函数如下
function getStore() {require_once "Auth/OpenID/MySQLStore.php";$db =& DB::connect(array('phptype' => 'mysql','username' => 'root','password' => 'root','hostspec' => 'localhost','database' => 'blog')); $store = new Auth_OpenID_MySQLStore($db); $store->createTables(); return $store;}