用户在登录或者登出多说评论框时为了通知当前使用多说的站点该用户已经登录或者登出,当前站点可以设置登录和登出的回调地址,用户在完成多说的登录或登出后,多说会回调当前站点设置的回调地址同时会带上code参数,站点可以用code获取用户的access_token并通过access_token获取用户的信息。通过这个功能可以实现登录多说的同时也登录当前使用多说的网站

这篇文档说明使用多说通用代码的站点,如何实现单点登录(以下缩写为SSO)的功能。设置SSO之后,当用户在多说评论框进行登出操作时,也会同时登出当前站点。

基本设置

修改获得的通用版插件代码,在duoshuoQuery中加入sso,设置login地址和logout地址:

    var duoshuoQuery = {
       short_name: "duoshuo", 
       sso: { 
           login: "http://xxx.com/login/",//替换为你自己的回调地址
           logout: "http://xxx.com/logout/"//替换为你自己的回调地址
       }};

    (function() {
        var ds = document.createElement('script');
        ds.type = 'text/javascript';ds.async = true;
        ds.src = 'http://static.duoshuo.com/embed.js';
        ds.charset = 'UTF-8';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();

设置完成后, 多说评论框 -> 帐号管理 -> 登出, 会跳转到之前设置的logout页面:

Logout

登录后如何跳转回登录之前的页面的说明

最近有很多用户问道,如何实现用户登录后返回用户登录前的那个页面方便用户评论。对于这个问题可以在回调地址中带上当前页面地址的参数,例如用户登录的页面是 http://xxx.com/x.html 则进行如下设置,设置好了之后就可以根据from参数来跳转回用户之前的页面了。

    var duoshuoQuery = {
       short_name: "duoshuo", 
       sso: { 
           login: "http://xxx.com/login/?from=http://xxx.com/x.html",//替换为你自己的回调地址
           logout: "http://xxx.com/logout/from=http://xxx.com/x.html"//替换为你自己的回调地址
       }};

    (function() {
        var ds = document.createElement('script');
        ds.type = 'text/javascript';ds.async = true;
        ds.src = 'http://static.duoshuo.com/embed.js';
        ds.charset = 'UTF-8';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();

添加登录按钮

在登录页面(例如login)插入如下代码。

<div class="ds-login"></div>

多说会自动生成一行按钮,包括所有当前支持的登录方式:

如果看不到这些登录按钮,请确认当前页面是否正确插入了多说通用版插件的代码

处理返回的code

相应按钮,会跳转到相应的社会化媒体授权页面,授权结束后跳转回在sso中设置的login地址,注意这时候的URL带上了code参数: Logout

将code以POST的方式提交到多说API,交换token,以Python代码为例:

duoshuo_code = request.GET.get('code','')
url = 'http://api.duoshuo.com/oauth2/access_token' 
response = urllib2.urlopen(url, 'code='+duoshuo_code)

Php示例请参考:https://github.com/duoshuo/duoshuo-wordpress/blob/master/duoshuo/Client.php#L108 中的 getAccessToken 函数的处理

注意: http://api.duoshuo.com/oauth2/access_token 是一个POST接口

response是一个JSON串,包含user_idaccess_tokenuser_id是该用户在多说的ID,access_token是访问多说API的凭证。

使用user_idaccess_token,通过用户信息接口获取信息: http://dev.duoshuo.com/docs/5444e002b2a222d8034c5f87

使用多说提供的SDK可以简化以上流程:

将SSO登录整合到你自己的网站

通过上述步骤获得多说ID,将多说ID与网站用户绑定。用户进行授权操作,如果返回的多说ID在数据库中存在,就登录和这个多说ID绑定的用户,否则提示用户注册或是进行其他处理。建议使用如下设计模式:

Flow

完成登录后,请将用户信息和多说token一同通过接口告知多说,建立连接。接口说明:http://dev.duoshuo.com/docs/51970ce019631c3e0f0002d1