2014-01-24 32 views
5

我正在使用Python和Django登录到Disqus。管理员已确认该帐户已启用SSO,并且其调试工具确认我的登录标记正确..但是我的配置似乎被忽略了。登录按钮未被替换等。Disqus SSO - 不工作

这是JS Disqus实现的示例..

var disqus_shortname = 'outfit418alpha'; 
var disqus_config = function() { 
     this.page.remote_auth_s3 = 'eyJ1c2VybmFtZSI6ICJkaXNxdXMiLCAiaWQiOiA1OTEsICJlbWFpbCI6ICJkaXNxdXNAb3V0Zml0NDE4LmNvbSJ9 577222fb9c6d5e03238fb70d29ac1104469e1e85 1390561160'; 
     this.page.api_key = 'jkNAtL6ivcDNjDBbl9RFMy3prUSypfTto1IRlrsaMFXqFauGQlQQHAwOo8R8bRlG'; 
     this.sso = { 
      url: '/profile/login/', 
      logout: '/profile/logout/', 
     } 
    } 

    var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; 
    dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; 
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); 
})(); 

任何人都可以指出我在哪里出错的方向?

回答

1

没有足够的信息来找出问题所在,因为到目前为止所有可用的检查都已经结束。以下是我们需要弄清楚的问题:

  1. 您是否看到除SSO登录选项之外的所有登录按钮?
  2. 你如何生成hmac字符串?你是否使用了相应的密钥到你的公钥上,以及你在remote_auth_s3字符串的末尾用相同的时间戳?
  3. 您是否正在测试您在API应用程序设置中作为受信任域输入的域?
  4. 您是否看到在threadDetails.json请求中发送的有效载荷?以下是如何检查:http://help.disqus.com/customer/portal/articles/1148640

我会根据这些更新答案。

我的确有一些建议来解决我看到的其他一些问题。

首先,看起来你只是缺少一些SSO所需的配置变量。这些都是可能的:

this.sso = { 
      name: "SampleNews", 
      button: "http://example.com/images/samplenews.gif", 
      icon:  "http://example.com/favicon.png", 
      url:  "http://example.com/login/", 
      logout: "http://example.com/logout/", 
      width: "800", 
      height: "400" 
    }; 

出的这些,nameurllogout应至少使用 - 所以一定要包括那些。

其次,请勿在this.sso配置中使用相对URL。由于这些网址在iframe(技术上说是disqus.com)中使用,因此某些浏览器会将这些网址解析为http://disqus.com/profile/login/,这显然不会达到预期的目的。

+0

感谢您的响应..它看起来像X-Disqus-Remote-Auth和X-Disqus-Publisher-API-Key不在标头中? – Lee

+0

这意味着有效载荷永远不会将它传递给我们的服务器来进行考虑。如果在嵌入代码之后放置'var disqus_config',它会起作用吗? –

+0

不好运气:(..你有任何其他想法。我建立一个为Disqus支持的例子,但我不断得到通用的回复。 – Lee

8

我们通过GitHub上的几个代码实现来将Disqus SSO集成到我们的Django网站中。我们的要求是一个简单的,我们用它下面的工作流程:

在disqus.py:

import base64 
import hashlib 
import hmac 
import json as simplejson 
import time 

DISQUS_SECRET_KEY = 'SECRET KEY FROM API' 
DISQUS_PUBLIC_KEY = 'PUBLIC KEY FROM API' 


def get_disqus_sso(user_id=None, username=None, email=None): 
    if user_id: 
     user_data = { 
      'id': user_id, 
      'username': username, 
      'email': email, 
     } 
    else: 
     user_data = {} 
    # create a JSON packet of our data attributes 
    data = simplejson.dumps(user_data) 
    # encode the data to base64 
    message = base64.b64encode(data) 
    # generate a timestamp for signing the message 
    timestamp = int(time.time()) 
    # generate our hmac signature 
    sig = hmac.HMAC(DISQUS_SECRET_KEY, 
        '%s %s' % (message, timestamp), hashlib.sha1).hexdigest() 

# return a script tag to insert the sso message 
    return """<script type="text/javascript"> 
    var disqus_config = function() { 
     this.page.remote_auth_s3 = "%(message)s %(sig)s %(timestamp)s"; 
     this.page.api_key = "%(pub_key)s"; 
     this.sso = { 
     name: "Screener Talks", 
     button: "http://www.screener.in/static/img/social/disqus.png", 
     url:  "http://www.screener.in/register/", 
     logout: "http://www.screener.in/logout/", 
     }; 
    } 
    </script>""" % dict(
     message=message, 
     timestamp=timestamp, 
     sig=sig, 
     pub_key=DISQUS_PUBLIC_KEY, 
    ) 

在views.py:

def _get_disqus_sso(user): 
    if user.is_authenticated(): 
     disqus_sso = get_disqus_sso(
      user.id, 
      user.display_name, 
      user.email,) 
    else: 
     disqus_sso = get_disqus_sso() 
    return disqus_sso 

def some_view(request): 
    ... 
    disqus_sso = _get_disqus_sso(request.user) 
    return render(request, "template.html", {"disqus_sso": disqus_sso}) 

而且在template.html:

<div id="disqus_thread"></div> 
    <script type="text/javascript"> 
     var disqus_shortname = 'SITESHORTNAME'; 
     var disqus_identifier = 'POST ID'; 
     var disqus_title = 'POST TITLE'; 
     /* * * DON'T EDIT BELOW THIS LINE * * */ 
     (function() { 
      var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; 
      dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; 
      (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); 
     })(); 
    </script> 
    <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript> 
    <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a> 
    {{ disqus_sso|safe }} 

大部分代码来自GitHub上的各种片段,但不幸的是我找不到确切的来源。这可能会有所帮助,但:https://github.com/jumoconnect/openjumo/blob/master/jumodjango/lib/disqus.py

+0

嗨那里..我不能看到你在模板中渲染disqus_sso的地方 – Lee

+0

在最后在模板'{{disqus_sso | safe}}'中输入 – Pratyush