网站用户系统集成微博登录时注意事项

借用微博账号来登录网站是一件很方便的事,微博也提供了比较丰富的API来完成这件事。比较常用的就是JS API和服务器端oauth API。

JS API的好处是集成非常简单,只需要引入微博的js文件并定义一个WB2.anyWhere函数即可,在这个函数里定义好login和logout的回调服务器接口,而在服务器接口里,你仍然需要服务器端oauth API获取登录用户信息,并完成本地网站的用户创建过程。

但缺点也非常致命,你无法对登录按钮和登录后的状态信息进行完全控制,如果你需要一种看起来非常自然的集成效果,那微博自带的那几个屌兮兮的样式绝对让人无法忍受。而另一方面,实际上服务器端的oauth API使用也是必不可少,回调时候总归要在服务器端绑定一个本地用户。

最终,我们还是选择抛弃JS API。通过服务器端API完成登录的基本流程是:

1. 生成登录链接

$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );

$code_url = $o->getAuthorizeURL( WB_CALLBACK_URL );

$cur_url = $_SERVER[“REQUEST_URI”];

return “$code_url&forcelogin=true&redirect=$cur_url”;

2. 用户点击时会,打开微博的登录页面。用户登录成功后重定向到回调页面。此时,根据回调带回的code参数获取accesstoken,在用accesstoken获取登录用户信息,并完成本地用户创建或绑定。

$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );

if (isset($_REQUEST[‘code’])) {

$keys = array();

$keys[‘code’] = $_REQUEST[‘code’];

$keys[‘redirect_uri’] = WB_CALLBACK_URL;

try {

$token = $o->getAccessToken( ‘code’, $keys ) ;

} catch (OAuthException $e) {

var_dump($e);

}

}

 

if ($token) {

$_SESSION[‘token’] = $token;

setcookie( ‘weibojs_’.$o->client_id, http_build_query($token) );

$c = new SaeTClientV2( WB_AKEY , WB_SKEY ,  $_SESSION[‘token’][‘access_token’]);

$uid_get = $c->get_uid();

$uid = $uid_get[‘uid’];

$um = $c->show_user_by_id($uid);

$u = UserSns::create($um[‘id’],$um[‘name’],$um);

Visitor::login($u->getUser());

$this->simpleRender(‘weibosuccess’);

} else {

echo ‘授权失败。’;

}

这样完成了用户创建后,基本就完成了。

但有时候,如果用户系统是基于email的(也就是email要用来登录、验证、找密码、接收通知等等),最好的办法是在授权成功后不要只是简单地自动创建一个用户,而应该让用户完成注册流程,也就是再填写email和登录密码然后创建一个不是那么特殊的用户,从而更好地将微博登录的用户和网站自身的用户系统融合。

OSX下安装phpredis

由于OSX自带的php是5.3.26,而我使用的XAMPP又是5.4.16. 安装时想当然的直接照着别人的方法去做。结果总是因为使用了错误的php配置编译phpredis,造成总是如下错误:

PHP Warning:  PHP Startup: redis: Unable to initialize module
Module compiled with module API=20090626
PHP    compiled with module API=20100525
These options need to match
 in Unknown on line 0

算是典型性OSX上多PHP环境造成的问题,呵呵

开始我把/usr/bin下的php,phpize,php-config全部改为link指向XAMPP里对应的文件,但编译出来还是有问题。最后不得已,全部改成完整路径。算是解决了。

网上搜索如果不仔细看的话都是这样简单的做法:

phpize
./configure
sudo make
sudo make install

但实际上:

sudo /Applications/XAMPP/xamppfiles/bin/phpize

sudo MACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS=”-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp” CCFLAGS=”-arch i386 -arch x86_64 -g -Os -pipe” CXXFLAGS=”-arch i386 -arch x86_64 -g -Os -pipe” LDFLAGS=”-arch i386 -arch x86_64 -bind_at_load” ./configure –with-apxs=/Applications/XAMPP/xamppfiles/bin/apxs –with-php-config=/Applications/XAMPP/xamppfiles/bin/php-config

sudo make

sudo make install

最后修改php.ini文件,加入extension=redis.so

总结下来,OSX上的php环境绝对是一件让人蛋疼的事。几乎所有需要编译安装的php扩展(如memcached,mongodb)都需要这样做。否则都是那个经典的“not match”。