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

借用微博账号来登录网站是一件很方便的事,微博也提供了比较丰富的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和登录密码然后创建一个不是那么特殊的用户,从而更好地将微博登录的用户和网站自身的用户系统融合。