2014-01-24 3 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. Вы видите все кнопки входа, кроме опции входа в систему единого входа?
  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" 
    }; 

Из них name, url и logout следует использовать как минимум - поэтому убедитесь, что вы включили их.

Во-вторых, не используйте относительные URL-адреса в конфигурации this.sso. Поскольку эти URL-адреса используются в iframe (технически disqus.com), некоторые браузеры будут разрешать URL-адреса как 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 для интеграции SSO Disqus на нашем сайте 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

Смежные вопросы