2010-11-21 2 views
0

Dans mon site django, j'utilise le nouveau SDK javascript facebook pour permettre à mes utilisateurs d'envoyer une invitation à leurs amis facebook.envoyer un ami facebook en utilisant le nouveau SDK javascript affiche 403 page interdite mais l'invitation est envoyée avec succès

Mais Lorsque les utilisateurs envoient l'invitation d'un site Web (après la connexion & sélection des amis de la facebook popup), l'invitation est envoyée avec succès, mais les utilisateurs voir un "403 Forbidden -. Cross Site Request Forgery détecté Interruption de" la page (à la même URL à partir de laquelle l'invitation a été envoyée). Comment surmonter cette validation csrf.

Le code javascript pour l'invitation (après le chargement du SDK facebook):

<script> 
function invitePopup() { 
FB.login(function(response) { 
    if (response.session) { 
    // user successfully logged in 
    FB.ui({ 
     method:'fbml.dialog', 
     fbml: (
      '<fb:request-form action="http://{{site.domain}}{% url account_view %}" method="post" invite="true" type="{{ site.name }}" ' + 
       'content="help the world by spreading good ideas. Join the move! <fb:req-choice url=\'http://{{site.domain}}{% url facebook_login %}?facebook_invitation=1\' label=\'Accept\' />" >' +     
       '<fb:multi-friend-selector showborder="false" bypass="cancel" actiontext="Invite your friends to join {{ site.name }}" /> '+ 
      '</fb:request-form>' 
      ), 
      size: { width:640, height:480}, width:640, height:480 
     }); 

    $(".FB_UI_Dialog").css('width', $(window).width()*0.8); // 80% of window width 
    } else { 
      // user cancelled login 
     } 
    });  

} 
</script> 

et la pièce de déclenchement:

<a href="#" onclick="invitePopup();" class="facebook">Invite your Facebook friends to join {{ site.name }} </a> 

Il existe une solution que je l'ai essayé à-dire à l'aide décorateur csrf_exempt pour la vue. Mais je ne veux pas l'utiliser parce que j'utilise plus de formulaires dans cette vue qui nécessite une protection csrf.

Répondre

1

vous pouvez inclure crsf_token comme ceci:

FB.ui({ 
     method:'fbml.dialog', 
      fbml: (
       '<fb:request-form action="http://{{site.domain}}{% url account_view %}" method="post" invite="true" type="{{ site.name }}" ' + 
'content="help the world by spreading good ideas. Join the move! <fb:req-choice url=\'http://{{site.domain}}{% url facebook_login %}?facebook_invitation=1\' label=\'Accept\' />" >' 

+ "{% csrf_token %}"+ 


'<fb:multi-friend-selector showborder="false" bypass="cancel" actiontext="Invite your friends to join {{ site.name }}" /> '+ 
       '</fb:request-form>' 
       ), 
       size: { width:640, height:480}, width:640, height:480 
      }); 

fonctionne parfaitement pour moi.

Hf

+0

Nice. Je vote pour accepter celui-ci comme réponse. –

Questions connexes