多说是目前用的最广泛的一个社会化插件,同时也支持各主流网站的单点登录。官方有详细的开发文档:
http://dev.duoshuo.com/docs/5023323ce9b7bde608000012
首先是设置
需要在多说评论的配置中加入sso
相关参数
sso: {
login: "/sso-login",//替换为你自己的回调地址
logout: "/sso-logout"//替换为你自己的回调地址
}
这样,当用户通过多说评论登录你的网站后,就会调用http://你的站点地址/sso-login
,同时将code
参数传递过去。类似:http://wincn.net/sso-login?code=b96bd79a899c1f2e58baf10bdbd5a92f
。
添加登录按钮
这一点文档中已经说得很明白了,在你的登录页面中加入
<div class="ds-login"></div>
系统会自动生成登录按钮
登录按钮
后台如何解析?
那么后台如何利用code
进行用户信息的解析呢?
文档中提到,需要调用API:http://api.duoshuo.com/oauth2/access_token
,这是一个post接口。将code
参数以post的方式提交。
那么问题来了,根据官方的文档提交后,却得到了一下错误:
{
"code":2,
"errorMessage":"缺少client_id参数"
}
说是“缺少client_id参数”,但是文档中并没有提到client_id
啊?真是捉急。
又反复看了几遍文档,发现官方给出了一个php的示例。
好吧,我们打开示例,注意109行的$params
参数。
$params = array(
'client_id' => $this->shortName,
'client_secret' => $this->secret,
);
虽然我不懂php,但是看代码,应该能推断出:shortName就是client_id!
shortName就是注册多说时二级域名的唯一字符串,比如我的多说二级域名为:
gefangshuai.duoshuo.com
,那么gefangshuai
就是shortName。
多说基本设置中有域名信息。
这次我们提交两个参数:
{
client_id: your_short_name,
code: xxxxxxxxxxxx
}
终于,多说给我们返回了信息如下:
{
"access_token": "xxxxxxxxxxxxx",
"expires_in": 7776000,
"user_id": "453802",
"remind_in": 7775625,
"code": 0
}
根据返回信息获取用户详细信息
有了user_id
,我们可以很轻松的通过接口http://api.duoshuo.com/users/profile.json?user_id=xxx
获取用户的详细信息了,这是一个Get接口。
代码示例
以下是我用nodejs实现的部分代码示例:
/**
* 多说单点登录
*/
router.get('/sso-login', function (req, res, next) {
var code = req.query.code;
var url = 'http://api.duoshuo.com/oauth2/access_token';
superagent.post(url)
.type('form')
.accept('application/json')
.send({
client_id: config.site.duoshuo.short_name,
code: code
}).end(function (err, xhr) {
if(err) {
next(err);
}else{
var dsUser = xhr.body;
// 根据dsUser中的user_id信息,可以获取用户信息
}
});
});
网友评论