2015-03-09 5 views
1

enter image description hereполимер-печенье создает дубликат Джанго CSRF печенья

нечетный вопрос, который я только что столкнулся. Кажется, что Django генерирует 2 файла cookie, когда я перехожу на эту страницу. Два файла cookie не имеют одного и того же токена, поэтому это приводит к сбою моего сообщения, потому что он проверяет неправильный файл cookie.

Кто-нибудь знает, почему это может произойти?

Ничего особенного в представлении:

class ListingDetailView(TemplateView): 
    template_name = "bidding/listing_detail.html" 

    def get(self, request, *args, **kwargs): 
     c = self.get_context_data(**kwargs) 
     c['listing'] = get_object_or_404(Listing, id=kwargs['id']) 
     return self.render_to_response(c) 

... хотя мне кажется, что код нарушитель может быть в одном из моих пользовательских компонентов (когда я это скрыть, дополнительные куки не генерируется):

<polymer-element name="bts-place-bid" attributes="href"> 
    <template> 
     <polymer-cookie id="csrfcookie" name="csrftoken"></polymer-cookie> 
     <core-ajax 
      id="bidxhr" 
      method="post" 
      body="" 
      url="{{ href }}" 
      headers='{"X-CSRFToken": "{{ csrftoken }}"}' 
      on-core-response="{{ handleResponse }}"> 
     </core-ajax> 

     <core-style ref="bts-place-bid"></core-style> 
     <paper-button on-click="{{ toggleDialog }}">Place Bid</paper-button> 

     <paper-action-dialog heading="Place Bid" 
         transition="core-transition-center" 
         id="bidDialog"> 
      <core-style ref="bts-bid-dialog"></core-style> 

      <bts-field> 
       <label for="id_amount">Bid Amount in Rands</label> 
       <input type="number" name="amount" id="id_amount" value="{{ amount }}"> 
      </bts-field> 

      <bts-field vertical layout> 
       <label for="id_proposal">Short note or proposal for this bid</label> 
       <textarea rows="4" id="id_proposal" name="proposal" value="{{ proposal }}"></textarea> 
      </bts-field> 

      <paper-button dismissive><core-icon icon="cancel"></core-icon> Cancel</paper-button> 
      <paper-button on-click="{{ placeBid }}" affirmative><core-icon icon="note-add"></core-icon> Place Bid!</paper-button> 
     </paper-action-dialog> 
     <paper-toast id="toastMsg" text=""></paper-toast> 

    </template> 
    <script> 
     Polymer({ 
      amount: 0, 
      proposal: "", 
      bidPayload: "", 

      ready: function() { 
       this.csrftoken = this.$.csrfcookie.value; 
      }, 
      toggleDialog: function(ev, detail, sender) { 
       this.$.bidDialog.toggle(); 
      }, 
      placeBid: function(ev, detail, sender) { 
       this.$.toastMsg.text = "Placing bid, please wait..." 
       this.$.toastMsg.show(); 

       this.$.bidxhr.body = "amount=" + this.amount + "&proposal=" + this.proposal; 
       this.$.bidxhr.go(); 
      }, 
      handleResponse: function(ev, detail, sender) { 
       this.$.toastMsg.text = "Bid placed, refreshing..."; 
       this.$.toastMsg.show(); 
       // Auto refresh the page... 
       window.location = window.location; 
      } 
     }); 
    </script> 
</polymer-element> 

Я подозреваю, что проблема может быть с <polymer-cookie>, я буду копаться это источник немного.

+0

Можно предположить, что вы уже пытались очистить свой кеш и загружать только одну страницу? Вы можете опубликовать свой шаблон и просмотреть код? – dylrei

+0

@dylrei добавил некоторые дополнительные бит. Да очищенный кеш, и это происходит только на страницах, где я использую настраиваемый компонент, упомянутый выше. Я теперь подозреваю, что проблема может быть связана с Andre

+0

Используйте другое имя для вашего полимера-печенья. Вот где вы устанавливаете второй файл cookie под названием «csrftoken» – dylrei

ответ

1

В конце концов решение было довольно простым. Должен был подумать об этом раньше.

Я просто изменил свой пользовательский компонент, чтобы принять дополнительный атрибут csrftoken, и этому атрибуту могу просто передать переменную django {{ csrf_token }}. Нет необходимости искать кук, нет необходимости добавлять дополнительные поля ввода и т.д.

Вот последний компонент:

<polymer-element name="bts-place-bid" attributes="href csrftoken"> 
    <template> 
     <core-ajax 
      id="bidxhr" 
      method="post" 
      body="" 
      url="{{ href }}" 
      headers='{"X-CSRFToken": "{{ csrftoken }}"}' 
      on-core-response="{{ handleResponse }}"> 
     </core-ajax> 

     <core-style ref="bts-place-bid"></core-style> 
     <paper-button on-click="{{ toggleDialog }}">Place Bid</paper-button> 

     <paper-action-dialog heading="Place Bid" 
         transition="core-transition-center" 
         id="bidDialog"> 
      <core-style ref="bts-bid-dialog"></core-style> 

      <bts-field> 
       <label for="id_amount">Bid Amount in Rands</label> 
       <input type="number" name="amount" id="id_amount" value="{{ amount }}"> 
      </bts-field> 

      <bts-field vertical layout> 
       <label for="id_proposal">Short note or proposal for this bid</label> 
       <textarea rows="4" id="id_proposal" name="proposal" value="{{ proposal }}"></textarea> 
      </bts-field> 

      <paper-button dismissive><core-icon icon="cancel"></core-icon> Cancel</paper-button> 
      <paper-button on-click="{{ placeBid }}" affirmative><core-icon icon="note-add"></core-icon> Place Bid!</paper-button> 
     </paper-action-dialog> 
     <paper-toast id="toastMsg" text=""></paper-toast> 

    </template> 
    <script> 
     Polymer({ 
      amount: 0, 
      proposal: "", 
      bidPayload: "", 

      toggleDialog: function(ev, detail, sender) { 
       this.$.bidDialog.toggle(); 
      }, 
      placeBid: function(ev, detail, sender) { 
       this.$.toastMsg.text = "Placing bid, please wait..." 
       this.$.toastMsg.show(); 

       this.$.bidxhr.body = "amount=" + this.amount + "&proposal=" + this.proposal; 
       this.$.bidxhr.go(); 
      }, 
      handleResponse: function(ev, detail, sender) { 
       this.$.toastMsg.text = "Bid placed, refreshing..."; 
       this.$.toastMsg.show(); 
       // Auto refresh the page... 
       window.location = window.location; 
      } 
     }); 
    </script> 
</polymer-element> 

... и это затем используется в основном шаблоне Джанго как таковые :

<bts-place-bid href="{% url 'bidding_listing_bid' id=listing.id %}" 
       csrftoken="{{ csrf_token }}"></bts-place-bid> 
1

Итак ... вы определенно создаете этот второй файл cookie. Это не ошибка. Но давайте посмотрим, не сможем ли мы вернуть вас в нужное русло.

Источник для полимер-печенья показывает несколько «скрытых» атрибутов:

<polymer-element name="polymer-cookie" hidden attributes="name value expires secure domain path max-age"> 

вы настраиваете печенье имеет такое же имя, что и знак CSRF, но произвольное значение. Таким образом, простое решение проблемы, вероятно, указать значение, которое вы хотите иметь:

<polymer-cookie id="csrfcookie" name="csrftoken" value="{{ csrftoken }}"></polymer-cookie> 

Я бы ожидать, что вы будете по-прежнему дублируются печенье, но, по крайней мере, теперь они будут иметь одинаковое значение.

Как вам должен сделать это ... пропустить полимер-печенье и просто положить {% csrftoken %} в ваш шаблон. Это создаст скрытый ввод с именем «csrfmiddlewaretoken», на котором вы можете проверить значение на стороне клиента. Затем вы можете вернуть это значение с помощью POST-адресов ajax.

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