多說是目前用的最廣泛的一個社會化插件,同時也支持各主流網站的單點登錄。官方有詳細的開發文檔:
http://dev.duoshuo.com/docs/5023323ce9b7bde608000012
首先是設置
需要在多說評論的配置中加入sso
相關參數
sso: {
login: "/sso-login",//替換為你自己的回調地址
logout: "/sso-logout"http://替換為你自己的回調地址
}
這樣,當用戶通過多說評論登錄你的網站后,就會調用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信息,可以獲取用戶信息
}
});
});